2016-10-08 7 views
0

私はCollat​​z構造を作成しようとしていますが、何回実行するかをユーザーに尋ねます。次に、毎回3ずつ増加するコードをループします(n = n + 3)。コードが部分的に機能している間、それは終了した前のプロセスを繰り返し続けます。入力が5であり、プロセス「Child 1 = 5,16,8,4,2,1」および「Child 2 = 8,4,2,1」および「Child 3 = 11,34,17」を3回実行する、52,26,13、等。 "
問題は、何度も繰り返しループしており、各子を複数回実行していることです。それが正しい場合、そしてそれを2回目に実行すると、シーケンスは「1」で始まります。
私はこれをLinux Debianから実行しています。コンパイルするには "gcc -o filename filename.c"を使い、実行するには "./filename 5"を使います。ここで5はCollat​​z構造体の "n"に渡される数値です。次に、ループを実行する回数を入力します。
私はおそらく道のりは分かっていますが、私は完全に失われており、援助に感謝します。Collat​​z Structure Loop

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

int main(int argc, char *argv[]) 
{ 
    pid_t pid; 
    int n, j, x; 
    printf ("How many times would you like this to run?\n"); 
    scanf ("%d",&j); 

    if (argc == 1) { 
     fprintf (stderr,"Usage: ./a.out <starting value>\n"); 
     return -1; 
    } 
    printf("\nMain program's process ID: %d\n",getpid()); 
    n = atoi(argv[1]); 

    for (x=1; x <= j; x++){ 
     pid = fork(); 

     if (pid < 0) { 
      fprintf(stderr, "Unable to fork child\n"); 
      return -1; 
     } 
     else if (pid == 0) { /*child process */ 
      printf("\nChild %d (ID: %d)\n",x,getpid()); 
      printf("\nStart sequence at: %d\n",n); 
      while (n != 1) { 
       n = n % 2 ? 3 * n + 1 : n/2; 
       printf("\n(Child %d) %d ",x,n); 

      } 
      printf("\n\nAbout to end execution (I'm process %d) .\n",getpid()); 
     } 
     else { /* parent process */ 
      wait(NULL); 
      n = n + 3; 
     } 
    } 
    return 0; 
} 

答えて

0

それが完了したら、あなたはそれがより多くのプロセスを生成親のメインループを継続させることだ、子プロセスを終了していないように私には見えます。また、あなたはプロセスを実行していて、それを待っていましたが、親プロセスに計算をさせるだけでなく、すべての子を生成して、それぞれの時間に完了するのを待っています。私は上記といくつかのスタイルの微調整を組み込むために、あなたのコードを作り直しました:

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

int main(int argc, char *argv[]) { 

    if (argc == 1) { 
     fprintf(stderr,"Usage: ./a.out <starting value>\n"); 
     return EXIT_FAILURE; 
    } 

    int j; 
    printf ("How many times would you like this to run?\n"); 
    scanf ("%d", &j); 
    (void) fpurge(stdin); 

    printf("\nMain program's process ID: %d\n", getpid()); 

    int n = atoi(argv[1]); 

    for (int x = 1; x <= j; x++) { 
     pid_t pid = fork(); 

     if (pid == -1) { 
      fprintf(stderr, "Unable to fork child\n"); 
      return EXIT_FAILURE; 
     } else if (pid == 0) { /* child process */ 
      pid_t child_pid = getpid(); 

      printf("\nChild %d (ID: %d)\n", x, child_pid); 
      printf("\nStart sequence at: %d\n", n); 
      while (n != 1) { 
       n = n % 2 ? 3 * n + 1 : n/2; 
       printf("\n(Child %d) %d ", x, n); 
      } 

      printf("\n\nAbout to end execution (I'm process %d).\n", child_pid); 

      return EXIT_SUCCESS; /* child terminates */ 
     } 
     else { /* parent process */ 
      n = n + 3; 
     } 
    } 

    for (int x = 1; x <= j; x++) { 
     wait(NULL); 
    } 

    return EXIT_SUCCESS; 
} 

SAMPLEのRUN

> ./a.out 5 
How many times would you like this to run? 
4 

Main program's process ID: 1164 

Child 1 (ID: 1165) 

Start sequence at: 5 

(Child 1) 16 
(Child 1) 8 
(Child 1) 4 
(Child 1) 2 
(Child 1) 1 

About to end execution (I'm process 1165). 

Child 3 (ID: 1167) 

Start sequence at: 11 

(Child 3) 34 
(Child 3) 17 
(Child 3) 52 
(Child 3) 26 

(Child 3) 13 
Child 2 (ID: 1166) 
(Child 3) 40 

(Child 3) 20 
Start sequence at: 8 
(Child 3) 10 

(Child 3) 5 
(Child 2) 4 
(Child 3) 16 
(Child 2) 2 
(Child 3) 8 
(Child 2) 1 
(Child 3) 4 

(Child 3) 2 
About to end execution (I'm process 1166). 
(Child 3) 1 

About to end execution (I'm process 1167). 

Child 4 (ID: 1168) 

Start sequence at: 14 

(Child 4) 7 
(Child 4) 22 
(Child 4) 11 
(Child 4) 34 
(Child 4) 17 
(Child 4) 52 
(Child 4) 26 
(Child 4) 13 
(Child 4) 40 
(Child 4) 20 
(Child 4) 10 
(Child 4) 5 
(Child 4) 16 
(Child 4) 8 
(Child 4) 4 
(Child 4) 2 
(Child 4) 1 

About to end execution (I'm process 1168). 
> 

注文結果のうちは、スレッドを使用することを検討して、お邪魔しての結果を返す場合メインスレッドによって印刷されるか、何らかのロックを使用して出力を同期させます。または、子供が結果を、親が最終的に要約する一時ファイルまたはパイプに書き込ませるようにすることもできます。

一つの最終スタイルノート、main()から-1を返す、またexit(-1)をしない - 返すことは-1システムサブルーチンのエラーを示しているものの、オペレーティング・システムにmain()によって返される値は(範囲は0でなければなりません成功)を255に、1(失敗)を一般的なエラーインジケータとする。

+0

これはかなり意味があります。私は変数とコードのいくつかを間違ったセクションに入れていたが、それを修正する方法を理解できなかったことを知っていた。何時間も何日も費やす。あなたは間違いなく私を救った。私はそれらの余分なヒントだけでなく、素晴らしい情報に感謝!ありがとうございました! – asyncle

関連する問題