为什么这段代码会出现段错误?共享内存IPC SYSV。
int * addr;
int shmid = shmget(0xABC, 10*sizeof(int), IPC_CREAT);
addr = (int*) shmat(shmid, NULL, 0);
for(i = 0; i < 10; ++i){
addr[i] = (int)i*i;
}
shmdt(addr);
segfault
最佳答案
shmat()
出错时返回 (void *) -1
。
您的代码没有对此进行测试。所以如果 shmget()
失败,代码将尝试在此处取消引用 (void *) -1
:
addr[0] = ...
这肯定会引发未定义的行为。
shmat()
可能会失败,因为代码未指定对 shmget()
调用所请求的内存段的访问权限。 .
当您想从拥有进程写入它时,需要指定的合适权限是
S_IWUSR 00200 user has write permission
(请参阅 man 2 open
了解可能通过 shmget()
为内存段请求设置的完整访问权限)
作为一般建议:始终测试相关系统调用以获得结果。将所有此类系统调用视为“相关”,它们返回的值可能是未定义的或在系统调用失败时无法使用。
要在所示代码的特定情况下执行此操作,您可以像这样修改代码:
int shmid = shmget(0xABC, 10*sizeof(int), IPC_CREAT | S_IWUSR);
if (-1 == shmid)
{
perror("shmget() failed");
return EXIT_FAILURE;
}
int * addr = (int*) shmat(shmid, NULL, 0);
if (((void *) -1) == addr)
{
perror("shmat() failed");
return EXIT_FAILURE;
}
for(size_t i = 0; i < 10; ++i)
{
addr[i] = (int)i*i;
}
if (-1 == shmdt(addr))
{
perror("shmdt() failed");
return EXIT_FAILURE;
}
关于c - 为什么这段代码会出现段错误?共享内存IPC SYSV,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21363579/