c - System V 共享内存的段错误

标签 c shared-memory strcpy

我试图理解为什么当我尝试使用 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/

相关文章:

c - gets() 不要求输入,除非在它之前使用 getchar() 或另一个 gets()

c++ WINAPI 共享内存结构数组

c - 如何以有保证的方式将虚拟地址传递给 shmat() 函数

c - 在 C 中使用 strcpy 函数的优点

c++ - 在 C 中定义常量

c - 如何在从该 C 程序执行 C 程序的 shell 中更改环境变量?

c - 如何分配 16byte 内存对齐数据

c - 共享变量只在一个进程中改变

arrays - strcpy 崩溃程序

c++ - strcpy_s 是 C++ 标准的一部分吗?或者只是 MS Visual C++ 的一部分