我想使用共享内存以及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;然后不使用它是很奇怪的。我也看不到使用statusx

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

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

09-30 14:46
查看更多