2017-03-05 2 views
-2

子プロセスを使って1から2000の合計を計算する必要があるという問題があります。linuxの共有メモリの子プロセスを使って1から2000の合計を計算する

 #include <sys/types.h> 
    #include <sys/ipc.h> 
    #include <sys/shm.h> 
    #include <stdio.h> 
    #include <sys/wait.h> /* Needed for the wait function */ 
    #include <unistd.h> /* needed for the fork function */ 
    #include <string.h> /* needed for the strcat function */ 
    #define SHMSIZE 27 
    int main() { 
     int shmid; 
     char *shm; 
     int tong1=0; 
int tong2=0; 
     if(fork() == 0) { 
      shmid = shmget(2009, SHMSIZE, 0); 
      shm = shmat(shmid, 0, 0); 
      int i; 

      for(i=0; i<1000; i++) { 
      tong1=tong1+i; 
      } 
      shmdt(shm); 
     } 
     else { 

      shmid = shmget(2009, SHMSIZE, 0666 | IPC_CREAT); 
      shm = shmat(shmid, 0, 0); 
      wait(NULL); 
      int j; 

      for(j=1000; j<=2000; i++) { 
      tong2=tong2+j; 
      } 
      shmdt(shm); 
      shmctl(shmid, IPC_RMID, NULL); 
     } 
     int tong=0; tong=tong1+tong2; 
printf("Sum is: %d",tong); 
     return 0; 
    } 

しかし、私が実行したときの結果は次のとおりです:ここに私のコードです合計は499500合計は私が間違っている1501500.あるのですか?

+0

あなたのコードをデバッグしてみてください。if内部でvhの印刷をフォークしてループ内で印刷し、何が起こっているのかを確認してください。 –

+5

[linuxの子プロセスを使って1から2000の合計を計算する]の可能な複製(http://stackoverflow.com/questions/42597516/calculate-sum-from-1-to-2000-using-child-process-in- linux) –

+0

なぜループと複数のプロセスを使うのですか?これはGauss式を使った単一の式です。 – Olaf

答えて

1

ため、2番目のサイクルでは、あなたは、共有メモリ・セグメントを作成しているが、あなたは何のためにそれを使用していない代わりにj++

for(j=1000; j<=2000; i++) { // <== should be j++ 
    tong2=tong2+j; 
    } 
0

i++を行います!単に共有メモリセグメントを作成しても、ローカル変数はプロセス間で共有されません。実際に共有メモリを読み書きする必要があります。

関連する問題