【发布时间】:2015-01-09 16:34:11
【问题描述】:
当我尝试使用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 有问题,但目前我不知道如何更正。
有什么想法吗?
【问题讨论】:
-
对于共享内存,代码需要:#include
和#include -
this: '#include
' 用于进程间通信,而不是共享内存。 this: '#include ' 用于信号量,而不是共享内存 -
如果没有正确的 #include 语句,此代码会导致编译器引发 17 个警告。 (并且警告需要更正)顺便说一句:链接时,是否访问了正确的库?
-
需要 #include
用于 printf() 等。需要 #include 用于 getpid() 和 sleep() -
其中一个文件 (sys/shm.h??) 包括 sys/ipc.h 并且使用该头文件进行编译需要在#include 之前放置以下语句:'#define _XOPEN_SOURCE'或“#define _SVID_SOURCE”
标签: c shared-memory strcpy