gpt4 book ai didi

linux - Linux 中的共享内存 fork 进程学习

转载 作者:太空宇宙 更新时间:2023-11-04 13:04:20 24 4
gpt4 key购买 nike

大家好!我只是想在 Linux 中使用 fork() 函数了解更多关于父进程和子进程的信息。我正在尝试制作一个非常简单的程序,在设置共享内存段之后,我可以从一个 child 那里得到一个结果并将其输出到 parent 那里。我的问题是它似乎不起作用。这是我目前所拥有的

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/shm.h>
#include <sys/stat.h>
#include <sys/types.h>
#define SZ 20

typedef struct
{
int size;
int cz[SZ];
}shared_data;

shared_data* Collatz(int);

int main (void)
{
pid_t pid;
int seg_id,size=sizeof(shared_data);
seg_id=shmget(IPC_PRIVATE,size,S_IRUSR | S_IWUSR);
shared_data *sd=(shared_data *)shmat(seg_id,NULL, 0);

int usr=-1,count,i;
while(usr<1 ||usr >9)
{
printf("Please Enter a Number between 1-9:");
scanf("%d",&usr);
}

pid=fork();
if(pid<0)
{
printf("Fork Failed");
return 1;
}
if(pid==0)
{
sd=Collatz(usr);
shmdt(sd);

}
else
{
wait(NULL);
printf("\nThe Sequence is: %d ",count);
for(i=0;i<sd->size;i++)
{
printf(" %d ",sd->cz[i]);
}
printf("\n");

}
return 0;
}



shared_data* Collatz(int val)
{
int i=0;
shared_data *data=malloc(sizeof(shared_data));
data->cz[i]=val;

while(val!=1)
{
i++;
if(val%2==0)
val=val/2;
else
val=(3*val)+1;
data->cz[i]=val;
}
data->size=i;
return data;

最佳答案

您正在分配给使用 malloc 分配的内存,而不是分配给使用 shmget/shmat 分配的内存。我不是 100% 确定你的意图,但可能只是将 child 的分配更改为以下内容就可以了。 (这将使用您在 Collat​​z() 中初始化的 mallocd 内容覆盖共享内存。)

*sd=Collatz(usr);

[编辑:我应该补充一点,您当前的代码 sd=Collat​​z(usr) 正在覆盖您从 shmat() 返回的 pointer 调用而不是指向的内存区域。]

关于linux - Linux 中的共享内存 fork 进程学习,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33110090/

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