我试图理解为什么当我尝试使用 strcpy
将一些字符复制到共享内存时,这段简单的代码会导致段错误:
#include <stdlib.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <string.h>
int main()
{
key_t key;
int flag,id;
char *buf;
flag=IPC_CREAT|0600;
if((key=ftok("myfile",12)) == -1 ) {
perror("key");
exit(2);
}
printf("%X\n",key);
if( (id=shmget(key,512,flag)) < 0) exit(1);
if( (buf=shmat(id,0,0)) < 0) exit(2);
printf("PID %d, buf=%p\n",getpid(),buf);
system("ipcs -m | grep 512");
sleep(20);
strcpy(buf,"Hello");
sleep(100);
shmdt(buf);
exit(0);
}
这是我得到的:
C1A0DAB
PID 12063, buf=0xffffffff8bc78000
0x0c1a0dab 271941746 username 600 512 1
Segmentation fault (core dumped)
此外,进程的 pmap 表明:
00007f778bc78000 4K rw-s- [ shmid=0x10358072 ]
我猜指针 buf
有问题,但到目前为止我不知道如何更正它。
有什么想法吗?
最佳答案
请在启用所有警告的情况下进行编译(例如,至少 -Wall
用于 gcc 和 clang)。
你错过了 #include <sys/shm.h>
,因此您的编译器假定 smhat
返回一个 int,而实际上它返回一个 void*
.如果 int 的大小和 void*
不匹配,你有问题。
添加那个 include,添加你遗漏的其他那些,它应该可以工作。
关于c - System V 共享内存的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27865050/