2016-04-29 20 views
1

プロセスを一時停止してプログラムを続行する方法があるかどうかを知りたいのですが。プロセスを一時停止してプログラムを続ける方法は?

私はこのようなプロセスを作成する必要があります。
enter image description here

をしかし、私はP4を打ったときには、終了死に、その後、P2がP5を作成します。その後、P2 DiesとP1はP3を作成し、同じことがそこで起こります。

プロセスが終了する前に、全体のツリーを作成する必要があります。
waitでもwaitpid()でも使用することはできません。

P4を一時停止してその父親から続行する方法はありますか?
どうすれば目標を達成できますか?

現在のコード私:それはこの順序で作成しています:

P1 - > P2 - > P4 - > P4が死ぬ - > P5 - > P2が死ぬ - - > P3 - > P6> P5はDIES - > P6が死ぬ - > P7 - > P7が死ぬ - > P3が死ぬ - > P1あなただけに必要なので、

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


int main(){ 
    clock_t t; 
    double time_taken; 
    t = clock(); 
    int status; 
    pid_t idProcesso, pai; 
    printf("P1 created: %d\n", getpid()); 

    idProcesso = fork(); 
    switch(idProcesso) 
    { 
     case -1: exit(1); 

     case 0: //P2 
      printf("P2 created: %d - son of P1: %d\n", getpid(), getppid()); 
      idProcesso = fork(); 
      switch(idProcesso) 
      { 
       case -1: exit(1); 

       case 0: //P4 
        printf("P4 created: %d - son of P2: %d\n", getpid(), getppid()); 
        sleep(1); 
        break; 
       default://P2 
        idProcesso = fork(); 
        switch(idProcesso) 
        { 
         case -1: exit(1); 

         case 0://P5 
          printf("P5 created: %d - son of P2: %d\n", getpid(), getppid()); 

          break; 
         default://P2 
          sleep(1); 
          break; 
        } 

        break; 
      } 
      break; 
     default: 

      idProcesso = fork(); 
      switch(idProcesso) 
      { 
       case -1: exit(1); 

       case 0://P3 
        printf("P3 created: %d - son of P1: %d\n", getpid(), getppid()); 
        idProcesso = fork(); 
        switch(idProcesso) 
        { 
         case -1: exit(1); 

         case 0://P6 
          printf("P6 created: %d - son of P3: %d\n", getpid(), getppid()); 
          sleep(1); 
          break; 
         default://P3 
          idProcesso = fork(); 
          switch(idProcesso) 
          { 
           case -1: exit(1); 

           case 0://P7 
            printf("P7 created: %d - son of P3: %d\n", getpid(), getppid()); 
            break; 
           default://P3 

            break; 
          } 
          sleep(1); 
         break; 
        } 
        break; 

       default: 
        sleep(4); 
        break; 
      } 
      break; 
    } 



    printf("Process id: %d terminated\n", getpid()); 
    exit(0); 
} 
+0

最近のLinuxでは、プロセスを再親子化することができます:http://stackoverflow.com/questions/6476452/process-re-parenting-controlling-who-is-the-new-parent –

+0

7つのプロセスすべてが必要です同じ時間に走ったり、木を連続的に建てたりして、あなたが行くにつれて根や枝が枯れるでしょうか? p7は最後のプロセスであるべきですか? –

+0

そしてなぜあなたはいくつかの従来の同期メカニズムを使用できませんか?パイプのように。 –

答えて

1

プロセスは、それぞれ独立して実行死ぬ:

  1. あなたのすべてのプロセスが作成されるのに十分な時間あなたの子プロセスを生かしておきます。例えば、sleep()を使うのは簡単です。

  2. 子プロセスをすべて作成するまでは、子プロセスのいずれも起動しないでください。

ここでは例です:出力と

#define _POSIX_C_SOURCE 200809L 

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

int main(void) 
{ 
    pid_t pids[8] = {0}; 
    printf("P1 created (%lu).\n", (unsigned long) getpid()); 

    for (size_t i = 1; i < 3; ++i) { 
     pids[i] = fork(); 

     if (pids[i] == -1) { 
      perror("fork() error"); 
      exit(EXIT_FAILURE); 
     } 
     else if (pids[i] == 0) { 
      printf("P%zu created (%lu).\n", i + 1, (unsigned long) getpid()); 

      for (size_t j = 1 + i * 2; j < 3 + i * 2; ++j) { 
       pids[j] = fork(); 

       if (pids[j] == -1) { 
        perror("fork() error"); 
        exit(EXIT_FAILURE); 
       } 
       else if (pids[j] == 0) { 
        printf("P%zu created (%lu).\n", j + 1, 
          (unsigned long) getpid()); 
        sleep(8 - j); 
        printf("P%zu exiting.\n", j + 1); 
        exit(EXIT_SUCCESS); 
       } 
      } 

      for (size_t j = 2 + i * 2; j >= 1 + i * 2; --j) { 
       if (waitpid(pids[j], NULL, 0) == -1) { 
        perror("waitpid() error"); 
        exit(EXIT_FAILURE); 
       } 
       printf("Waited for P%zu (%lu).\n", j + 1, 
         (unsigned long) pids[j]); 
      } 

      printf("P%zu exiting.\n", i + 1); 
      exit(EXIT_SUCCESS); 
     } 
    } 

    for (size_t i = 2; i > 0; --i) { 
     if (waitpid(pids[i], NULL, 0) == -1) { 
      perror("waitpid() error"); 
      exit(EXIT_FAILURE); 
     } 
     printf("Waited for P%zu (%lu).\n", i + 1, (unsigned long) pids[i]); 
    } 

    printf("P1 exiting.\n"); 

    return 0; 
} 

[email protected]:~/src/sandbox$ ./procs 
P1 created (27206). 
P2 created (27207). 
P3 created (27208). 
P4 created (27209). 
P5 created (27210). 
P6 created (27211). 
P7 created (27212). 
P7 exiting. 
Waited for P7 (27212). 
P6 exiting. 
Waited for P6 (27211). 
P3 exiting. 
Waited for P3 (27208). 
P5 exiting. 
Waited for P5 (27210). 
P4 exiting. 
Waited for P4 (27209). 
P2 exiting. 
Waited for P2 (27207). 
P1 exiting. 
[email protected]:~/src/sandbox$ 

注プロセスが実行される順序は本質的に予測不可能であるので、あなたがそれを実行するたびにあなたが得ることができること上記と若干異なる結果になります。私は、4つのリーフプロセスの中でsleep()で心のこもった試みを除いて、それらを作成または終了させようとはしていません。 sleep()への戦略的な呼び出しによって、実行と終了の順序をほぼ保証することができます。また、何らかの形のプロセス間通信を使用して保証することもできます。原則として、あなたは実際の作業が順番どおりに行われるかどうかについて、この順序に気を付けるべきではありません。

しかし、それらのうちのいずれかが死ぬ前にすべてのプロセスを生き残らせるという基準を満たしています。

+0

ありがとうございます。あなたのコードのコンパイル私はこれを持っています: 'P1(3808)、P3(3810)、P2(3809)' - >異なる順序ですが、PidsのためにOKです。しかし、今私は持っている: 'P6(3811)P4(3813)P7(3812)P5(3814)'。 Pidsは別の順序であるため、間違った順序で作成されているということはありませんか? – PlayHardGoPro

+1

@PlayHardGoPro:私は答えのこの部分にあなたを紹介します:「プロセスが実行される順序は本質的に予測不可能です。 –

+0

ロック!完璧に働きます。しかし、私はそれらのforループの理由を理解できませんでした。私は自分のコードを更新しましたが、それは正しいBUTプロセスが正しい順序で死ぬことはありません。 (親の前の子)。あなたはすばやく見ることができますか? – PlayHardGoPro