C++ 中的共享内存 UNIX 分段错误 (fork())
Shared Memory UNIX Segmentation Fault (fork()) in C++
我有共享内存和进程的问题。我将一个区域附加到共享内存,我创建了一个子进程,但是当我尝试修改父进程中的共享内存区域时,我只遇到分段错误,它只能在子进程中修改。
.h
struct infoHeaders {
char words[512];
int num [512];
};
int idShMem;
struct infoHeaders * ptrInfo;
.cc
idShMem = shmget( 123456, sizeof(struct infoHeaders), 0700 | IPC_CREAT );
ptrInfo = (infoHeaders *) shmat( idShMem, NULL, 0 );
if (!fork()) {
sem.wait();
exit(0);
}
else {
ptrInfo->num[0] = 1; //Segmentation Fault
sem.signal();
}
}
sem是一个Semaphore的对象class,我测试过没有问题
有什么想法吗?
检查 shmget 的 return 值(您存储在 idShMem 中)。呼叫有可能失败。如果它是负数,那么您一开始就永远不会成功分配内存。如果 idShMem 为负,那是你的问题。这类似于检查 malloc() 调用是否为 NULL。
如果您确实失败了,请将 errno.h 的包含语句添加到顶部,然后检查变量 "errno" 的值。这将是告诉您分配失败原因的错误代码。
我有共享内存和进程的问题。我将一个区域附加到共享内存,我创建了一个子进程,但是当我尝试修改父进程中的共享内存区域时,我只遇到分段错误,它只能在子进程中修改。
.h
struct infoHeaders {
char words[512];
int num [512];
};
int idShMem;
struct infoHeaders * ptrInfo;
.cc
idShMem = shmget( 123456, sizeof(struct infoHeaders), 0700 | IPC_CREAT );
ptrInfo = (infoHeaders *) shmat( idShMem, NULL, 0 );
if (!fork()) {
sem.wait();
exit(0);
}
else {
ptrInfo->num[0] = 1; //Segmentation Fault
sem.signal();
}
}
sem是一个Semaphore的对象class,我测试过没有问题
有什么想法吗?
检查 shmget 的 return 值(您存储在 idShMem 中)。呼叫有可能失败。如果它是负数,那么您一开始就永远不会成功分配内存。如果 idShMem 为负,那是你的问题。这类似于检查 malloc() 调用是否为 NULL。
如果您确实失败了,请将 errno.h 的包含语句添加到顶部,然后检查变量 "errno" 的值。这将是告诉您分配失败原因的错误代码。