c - 为什么这段代码会出现段错误?共享内存IPC SYSV

标签 c segmentation-fault shared-memory

为什么这段代码会出现段错误?共享内存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/

相关文章:

c - 全局指针的段错误

当数据复制/扫描/读取到未初始化的指针时崩溃或 "segmentation fault"

delphi - 在 PC 之间共享 Delphi 中的公共(public)内存区域

c - 符号查找错误: undefined symbol: fclose

c - 确定循环中发生的段错误?

MATLAB 帕福尔 : memory management: shared memory or not?

c - 有没有办法查看 ctype.h 中的类型中有哪些字符?

c - 我需要释放结构中的变量吗?

c - unsigned long long 类型的位移位

c - 关于空指针和赋值 C