c - 为什么子进程无法写入共享内存?

标签 c

我有一个简单的程序,可以写入共享内存并从共享内存中读取,但在读取时出现段错误。

当我调试时,子进程没有将信息写入共享内存,之后,父进程试图从没有数据的共享内存中读取,并在父进程的第一个 printf 处抛出段错误printf("%d\n",ptr->nread);

为什么子进程无法向共享内存写入数据? (它在 ptr->nread=20; 行失败)

#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/shm.h>
#define  SIZE 5*1024
struct databuf{
    int nread;
    char *buf;
    int xyz;
};
    struct databuf* ptr;
main()
{
    int shmid,pid;
    shmid = shmget((key_t)1,SIZE,IPC_CREAT|0777);
    pid =  fork();
    if(pid==0)
    {
            ptr = (struct databuf *)shmat(shmid,(char*)0,0);
            ptr->nread=20;
            ptr->buf=ptr+sizeof(ptr->nread);
            strcpy(ptr->buf, "abc");
            ptr->xyz=20;
    }
    else
    {
        wait(0);
        ptr = (struct databuf *)shmat(shmid,(char*)0,0);
        printf("%d\n",ptr->nread);
        printf("%s\n",ptr->buf);
        printf("%d\n",ptr->xyz);
    }
    return 0;
}

最佳答案

如果 ptr->nread 失败,那么在访问 ptr 之前,您应该输入类似这样的错误检查代码。

 ptr = (struct databuf *)shmat(shmid,(char*)0,0);
 if (data == (struct databuf *)(-1)) {
                perror("shmat failed");
                exit(1);
 }
 ptr->nread=20;

引用:http://linux.die.net/man/2/shmat

ptr->buf=ptr+sizeof(ptr->nread);

可以写成:

 ptr->buf=(char*)ptr+sizeof(struct databuf)+ptr->nread;

 ptr->buf=(char*)ptr+ptr->nread;

现在可以在父进程中访问该字符串。

简要说明: 如果您使用共享内存,则必须确保您要在其他进程中访问的所有数据都在共享内存段中。将数据保留在内存段中的指定偏移量(在您的情况下为 ptr+ptr->nread)。并注意不要覆盖共享内存中的现有数据。 sizeof(ptr->nread) 将产生 sizeof(int)。

关于c - 为什么子进程无法写入共享内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24993347/

相关文章:

c# - 在C#中动态调用不同的C DLL

c - 当非阻塞 send() 仅传输部分数据时,我们可以假设它会在下一次调用时返回 EWOULDBLOCK 吗?

c - 防止c中字符串溢出

c - 在 C 中按下 GPIO 按钮

c 如何返回从二进制文件读取的字符奇偶校验

c - Swift:无法将函数指针转换为 (void*) 以便在 C 风格的第三方库中使用

c - 指针符号

将一个字符连接成一个字符串

c - 帮助编译器优化函数指针

c - 为什么我不能修改 c 中的字符串文字?