C语言 为什么此代码给出段错误?共享内存 IPC 系统



为什么这段代码会给出段错误?共享内存 IPC 系统。

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);

段错误

shmat()

在出错时返回(void *) -1

您的代码不会对此进行测试。因此,如果shmget()失败,代码将尝试在此处取消引用(void *) -1

addr[0] = ...

这肯定会引发未定义的行为。

shmat()可能失败,因为代码错过了对调用shmget()请求的内存段的访问权限。

当您想从拥有过程中写入它时,要指定的适当权限是

S_IWUSR00200 用户具有写入权限

(请参阅man 2 openfor a Full ist o 访问权限,该访问权限可能由shmget()为 Memeory 段请求设置)


作为一般建议:始终测试相关系统调用的结果。将所有此类系统调用视为"相关",这些调用返回的值可能未定义或在系统调用失败时不可用。

若要在所示代码的特定情况下执行此操作,您可以像这样修改代码:

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;
}

相关内容

  • 没有找到相关文章

最新更新