我试图理解,当我试图使用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 ]

我想指针有点问题,但到目前为止我还不知道如何纠正。
有什么想法吗?

最佳答案

请在启用所有警告的情况下编译(例如gcc和clang至少-Wall)。
您缺少#include <sys/shm.h>,所以编译器假定smhat返回一个int,而实际上它返回一个void*。如果int和void*的大小不匹配,就有问题。
添加include,添加其他你在使用过程中丢失的内容,它应该会起作用。

关于c - System V共享内存出现段错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27865050/

10-16 20:40