gpt4 book ai didi

c - C语言中如何与父子进程共享内存

转载 作者:行者123 更新时间:2023-11-30 20:11:12 25 4
gpt4 key购买 nike

我想使用共享内存和fork()父进程和子进程计算阶乘。我的问题是子进程似乎不起作用,我想给出从父进程到子进程的一个数字并且在子级将阶乘结果传递给父级之后。但结果和我给的数字是一样的。

我被要求使用 snprintf()spritnf()itoa()atoi() 以便将变量传递给每个进程。

我达到了以下目标:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/wait.h>
#include <sys/shm.h>




int main(int argc , char *argv[])
{
int shmid,fid,status,x;
char *shm;
char *s;
int i,y,c;

key_t key=1990;
//create shared memory
shmid=shmget(1990,300,IPC_CREAT|0666);
fid=fork();
shm=shmat(shmid,NULL,0);

if(fid>0)//parent process
{
wait(&status);
s=shm;
printf("enter a number:");
scanf("%d",&x);
sprintf(s,"%d",x);//convert int to string
printf("factorial of number:%d is:%s\n",x,s);//result
shmdt(shm);
shmctl(shmid,IPC_RMID,0);

}else if(fid==0)//child process
{
shm=shmat(shmid,NULL,0);
c=atoi(s);//conver string to int
// calculate factorial
for(i=1;i<=c;i++)
{
y *=i;
}
return y;
sprintf(s,"%d",y);
shmdt(shm);

}
return 0;
}

最佳答案

你有:

if(fid>0)//parent process
{
wait(&status);

父进程做的第一件事就是等待子进程死亡。只有这样,它才会要求输入计算的数字。这不会很好地发挥作用。

您需要父进程请求号码,将其写入共享内存,并通过某种(其他)IPC 机制告诉子进程该号码已准备好。然后, child 应该醒来,读取数字,进行计算,并写出答案,然后通过退出来通知 parent 已完成。同时,父级现在可以等待子级完成,然后从共享内存中读取答案。

如果是我的代码,我会在调用 fork() 之前执行 shmat()。正如所写,子进程使用 shmat() 两次(一次在 fork() 之后,一次在 else if (fid == 0) 中> 代码。这不是正统。

创建key_t key = 1990;然后不使用它是很奇怪的。我也没有看到 statusx 被使用。

作为计算阶乘的一种方法,这是荒谬的。作为 IPC 和进程间同步的练习,这是一个很好的简单示例。

请记住,32 位整数最多只能存储 12 个值!而 64 位整数只能存储最多 20 个值!,因此通常明智的做法是创建一个阶乘表,或者只是即时计算它们。或者需要使用浮点运算;需要一段时间才能超出它们的范围(小于 200!,IIRC)。

关于c - C语言中如何与父子进程共享内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41894226/

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