为什么该代码会给出segfault?共享内存IPC系统
为什么该代码会给出segfault?共享内存IPC SYSV为什么该代码会给出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
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:除了“失败”之外,它没有告诉你更多吗?