我的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
可执行文件位于同一位置.