2017-10-03 5 views
0

私のプログラムは次のように表現しています。子供が分裂する親があり、この子は別の子を分けています。したがって、親、子、および子孫がある(すなわち、この子孫の親は子である)。プロセスを実行する前にサブチャイルドと親プロセスを待つ方法は?

子供はexeclp()でコマンドを実行します。子供が日付を単純にするとしましょう。サブチャイルドは同じことをします。

もちろん、子はコマンドを実行する前にサブファイルをフォークします。

子供が独自のコマンドを実行した後に、コマンドを実行するサブチャイルドを探しています。さらに、子供と子どもが彼らの命令を実行した後、私は親が自分のプロセスを続けることを望む。私は子供を行います(私は子供の実行のためのsubchild待ちをすることはできませんsubchild実行

  • を待つために親を作る方法がわからない

    • 私は2つの問題を持っていますexeclpを使用しているときにそのPIDを失う)

    ここに私の現在の実装である:?

    #include <stdio.h> 
    #include <stdlib.h> 
    #include <unistd.h> 
    
    int main (int argc, char **argv){ 
        pid_t pid1, pid2; 
    
        pid1 = fork(); 
    
        if (pid1 > 0) 
        { 
         int status; 
    
         // Wait child 
         printf("Parent waiting for child\n"); 
         waitpid(pid1, &status, 0); 
         printf("Parent has waited child\n"); 
    
         // Wait subchild 
         printf("Parent waiting for subchild\n"); 
         // Wait sub-child here? 
         printf("Parent has waited subchild\n"); 
    
         // End 
         printf("parent end\n"); 
        } 
        else 
        { 
         pid2 = fork(); 
    
         // Subchild 
         if (pid2 == 0) { 
          waitpid(getppid(), NULL, 0); // wait child? it doesn't work 
          execlp("/bin/date", "date", "+Subchild:\"%d-%m-%y\"", (char *) 0); 
          _exit(EXIT_FAILURE); 
         } 
         // Child 
         else { 
          execlp("/bin/date", "date", "+Child:\"%d-%m-%y\"", (char *) 0); 
          _exit(EXIT_FAILURE); 
         } 
        } 
    
        return 0; 
    } 
    

    私の二つの「問題」がライン21及び33

    ある出力は以下の通りです:

    Parent waiting for child 
    Subchild:"03-10-17" 
    Child:"03-10-17" 
    Parent has waited child 
    Parent waiting for subchild 
    Parent has waited subchild 
    parent end 
    

    subchildは早くそれができるように自分自身を実行...私は共有変数を使用してこれを解決したが、それ回避策のように感じられ、私はサブファミリーを待っている親に問題が残っていました。

  • +0

    あなたの質問の明確さにもかかわらず、アドバイスをするのは少し難しいです。順番に処理をしたい場合は、サブプロセスをフォークするのが間違った方法のように思えます。なぜフォーク?あなたはプロセスを分け合わせようとしていますが、逐次実行は何をしようとしていますか?プログラムを実行していない場合は、シグナルを使用して親プロセスグループとプロセスグループの間でやりとりすることができますが、実行するとそのオプションは失われます。 – Leonard

    +0

    件名に関するもう1つの良い例は、[** man 2 wait **](https://linux.die.net/man/2/wait)です。 –

    +0

    ありがとうございます。これは教育プログラムによく似ていますが、このアーキテクチャでは逐次実行を作成する方法を見つける必要があります。私はいくつかの解決策を試しましたが、exec()は非常に難しいと言いました(共有変数/セマフォ/ ...)。 – SugarMouse

    答えて

    0

    @ JonathanLefflerのおかげで、パイプを作成することで問題を解決できました。パイプの仕組みがわからないので時間がかかりましたが、最終的には思ったよりずっと簡単でした。

    @ DavidC.Rankin私はwait関数に関するドキュメントを読んでいますが、そのような状況では何の助けにもならないようです。

    ありがとうございます。

    関連する問題