Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么该代码会给出segfault?共享内存IPC系统_C_Segmentation Fault_Shared Memory - Fatal编程技术网

为什么该代码会给出segfault?共享内存IPC系统

为什么该代码会给出segfault?共享内存IPC系统,c,segmentation-fault,shared-memory,C,Segmentation Fault,Shared Memory,为什么该代码会给出segfault?共享内存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); int*addr; int shmid=shmget(0xABC,10*sizeof(in

为什么该代码会给出segfault?共享内存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);
int*addr;
int shmid=shmget(0xABC,10*sizeof(int),IPC_CREAT);
addr=(int*)shmat(shmid,NULL,0);
对于(i=0;i<10;++i){
地址[i]=(int)i*i;
}
shmdt(地址);
断层

错误时返回
(void*)-1

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

addr[0] = ...
这肯定会引发未定义的行为

可能已失败,因为代码未指定对调用请求的内存段的访问权限

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

S_IWUSR00200用户具有写入权限

(请参阅
shmget()
)为memeory段请求设置的完整ISTO访问权限)


一般建议:始终测试相关系统调用的结果。考虑所有这样的系统调用:“相关”,它返回一个可能在系统调用失败时可能未定义或不可用的值。 要在所示代码的特定情况下执行此操作,可以如下修改代码:

  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;
  }
int shmid=shmget(0xABC,10*sizeof(int),IPC|u CREAT|S|u IWUSR);
如果(-1==shmid)
{
perror(“shmget()失败”);
返回退出失败;
}
int*addr=(int*)shmat(shmid,NULL,0);
如果((void*)-1)=addr)
{
perror(“shmat()失败”);
返回退出失败;
}
对于(尺寸i=0;i<10;++i)
{
地址[i]=(int)i*i;
}
如果(-1==shmdt(地址))
{
perror(“shmdt()失败”);
返回退出失败;
}

在哪一行出现分段错误?它没有被写入,但我认为这是在4到7之间。一个好的开始是检查
shmget
shmat
的返回值是否有错误。我得到“shmat()失败”。为什么?@user3062986:除了“失败”之外,它没有告诉你更多吗?