我的 C 代码中有一个关于共享内存的问题。
我的 C 代码没有按我的预期工作:
#include "sys/ipc.h"
#include "sys/shm.h"
#include "unistd.h"
#include "sys/types.h"
#include "sys/wait.h"
#include "stdio.h"
#include "stdlib.h"
int main(){
key_t key = ftok("shmfile.txt", 65);
int shmid = shmget(key, sizeof(int), IPC_CREAT);
if (fork() != 0){
int * ptr = (int *) shmat(shmid, 0, 0); // This line returns -1
// This only happened
// to parrent
printf("shmid parrent = %d\n", shmid);
perror("Error ");
*ptr = 6;
shmdt(ptr);
wait(NULL);
shmctl(shmid, IPC_RMID, NULL);
}
else{
printf("shmid child = %d\n", shmid);
int * ptr = (int *) shmat(shmid, 0, 0); // Works as expected
printf("ptr address = %p\n", ptr);
shmdt(ptr);
printf("Now child can exit normally");
}
return 0;
}
结果如下(gdb):
shmid parrent = 45
Error : Permission denied
shmid child = 45
ptr address = 0xffffffffffffffff
Now child can exit normally
Program received signal SIGSEGV, Segmentation fault.
0x00005555555552d0 in main () at main_2.c:20
20 *ptr = 6;
我希望父进程和子进程都能正常工作。只有子进程正常退出。我不确定父进程有什么问题。非常感谢!
更新1:父进程和子进程中的ptr始终是
(void *) -1
。我不知道如何使 shmat()
不返回该值。
更新 2:文件“shmfile.txt”与
main
可执行文件位于同一位置。