2

私はいくつかのプログラムを実行し、fork()その後にexecve()3 番目のプログラムを使用しています。これらのプログラムが意図したことはすべて実行されますが、最後に 3 番目のプログラムが返されません...つまり、コマンド プロンプトが表示されません。

wait()呼び出しプログラムでコマンドを使用するexecveと、wait ステートメントの順序がプログラムの終了順序と一致する場合にのみ、のプログラムが返されexecveます。なぜでしょうか?

簡略化されたコードは次のとおりです。

int main()
{
   int child1,child2,status;
   char*newargv1[] = {./xyz",NULL};
   char *newargv2[] = {./abc",NULL};

   if((child1 = fork())==0)
      execve(newargv1[0],newargv1,NULL);
   if((child2 = fork())==0)
      execve(newargv2[0],newargv2,NULL);

    while(wait(&status) != child1);
    while(wait(&status) != child2);
  }

child1 が最初に終了すると、正常に動作します。./xyz と ./abc はいくつかの単純な処理があり、制御が終了します。

4

2 に答える 2

6
while(wait(&status) != child1);
while(wait(&status) != child2);

このコードでは、終了するまで待ちますが、最初child1に終了した場合child2は、ステータスを取得して破棄します。その後、child1終了すると、次のループに進みますが、child2既に破棄しているため、ステータスを取得することはできません。

代わりに、子の配列を保持waitし、単一のwhileループで配列の各メンバーのステータスを取得するまでループし、デッドロックすることはありません。

于 2011-06-18T08:33:42.323 に答える
1

それは、あなたが説明していることの正しい動作のように聞こえます。wait()待っていることが起こるまでブロックします。プログラムwaitが連続して複数のことを処理する場合、連続していくつかのことを待機する必要があります。waitpid()の代わりに使用しているようですwait()real を使用する場合はwait()、待機する子がいるのと同じ回数だけ呼び出す必要があります。

順序を気にしない場合は、プログラムが特定の順序に依存しないようにします。

于 2011-06-18T07:49:30.503 に答える