gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 02:02:43 26 4
gpt4 key购买 nike

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

当我调试时,子进程没有将信息写入共享内存,之后,父进程试图从没有数据的共享内存中读取,并在父进程的第一个 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com