2017-01-27 12 views
-2

共有メモリとfork()親プロセスと子プロセスで階乗を計算したいと思っています。私の問題は子プロセスが機能していないようですが、親から数値を渡したい子に、そして、子が階乗の結果を親に渡した後。しかし結果は私が与えた数と同じです。cで親プロセスと子プロセスを共有する方法

変数を各プロセスに渡すために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; 
} 
+1

親は、子が計算を完了するのを待たない。 – mch

+0

's'は子の共有メモリを指しません。 –

答えて

2

あなたが持っている:

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

親プロセスが最初に行うことは、子供が死ぬのを待っています。それだけで、計算への入力となる番号を尋ねます。これはうまくいくわけではありません。

番号を要求し、共有メモリに書き込んで、番号が準備されている(他の)IPCメカニズムを介して子に伝えるには、親が必要です。子供は目を覚まし、数字を読んだり、計算をしたり、答えを書いたりして、親にそれを単に終了させることで通知しなければなりません。一方、親は子が完了するのを待つことができ、共有メモリから答えを読み込むことができます。

fork()を呼び出す前に私のコードでは、私はshmat()をしていました。書かれたとして、子供はそれがkey_t key = 1990;を作成するために奇妙

。それはオーソドックスではありません。二回(一回だけ、一度else if (fid == 0)コードでfork()shmat()を使用していますし、それを使用していない。私はstatusxがあることが表示されません階乗を計算する方法として。どちらか

を使用し、これは本末転倒である。IPCでの運動や、プロセス間の同期として、それは素敵な単純な例である。

、32ビット整数ができる唯一の店舗の値を覚えておいてください最大12個の値を格納できますが、64ビット整数は20個までの値しか格納できないため、通常はsensiblですe階乗の表を作成するか、ただちにそれらを計算してください。または、浮動小数点演算を使用する必要があります。 (200!、IIRCのどこかで)範囲を外すのに時間がかかります。

関連する問題