我想使用共享内存以及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机制告知孩子该号码已准备好。然后,孩子应该醒来,读取数字,进行计算,然后写下答案,然后只需退出即可通知父母已完成。同时,父级现在可以等待子级完成,然后从共享内存中读取答案。
如果是我的代码,我会在调用
shmat()
之前先执行fork()
。按照书面规定,孩子使用shmat()
两次(一次在fork()
之后,一次在else if (fid == 0)
代码中。)这不是正统的。创建
key_t key = 1990;
然后不使用它是很奇怪的。我也看不到使用status
和x
。作为计算阶乘的一种方法,这是荒谬的。作为IPC和进程间同步的练习,这是一个很好的简单示例。
请记住,32位整数最多只能存储12个值! 64位整数最多只能存储20!的值,因此通常明智的做法是仅创建一个阶乘表-或即时计算它们。或者您需要使用浮点运算;它需要一段时间才能超出其范围(不到200!,IIRC)。