2

これが私のコードの内訳です。

私は子供をフォークし(そして子供のpidをファイルに登録し)そしてそれからそれ自身のことをするプログラムを持っています。子は、プログラマーがargvで威厳のあるプログラムになります。子が実行を終了すると、(SIGUSR1を使用して)シグナルを親プロセスに送り返し、親が子をファイルから削除することを認識します。親は1秒停止し、テーブルを更新して削除されたエントリを確認し、中断したところから続行する必要があります。

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

case 0 :{
    (*table[numP-1]).pid = getpid(); //Global that stores pids
    add();                             //saves table into a text file 
    freeT(table);                  //Frees table 
    execv(argv[3], &argv[4]);          //Executes new program with argv 
    printf("finished execution\n");  
    del(getpid());                     //Erases pid from file 
    refreshReq();                      //Sends SIGUSR1 to parent
    return 0;
}
default:{
    ... //Does its own thing
}
}

問題は、after execvが正常に開始および終了した後(return 0の前のprintfステートメントで通知されます)、switchステートメントの残りのコマンドが実行されていないことです。execvに^Cコマンドが含まれているのではないかと思います。これは、終了時に子を強制終了するため、残りのコマンドを終了することはありません。私はmanページを調べましたが、この主題に関して有用なものは何も見つかりませんでした。

ありがとう!

4

4 に答える 4

4

execv現在実行中のプログラムを別のプログラムに置き換えます。新しいプログラムが実行されると、古いプログラムは復元されないため、「成功するとexecvは返されません」と文書化されています。

したがって、失敗した場合にのみ、「実行が終了しました」というメッセージが表示されexecvます。

于 2011-03-02T19:23:05.240 に答える
3

execvは、現在のプロセスを新しいプロセスに置き換えます。system()新しいプロセスを生成するために、たとえば、、、またはとpopen()の組み合わせをfork()使用できます。exec()

于 2011-03-02T19:22:06.753 に答える
1

他の人々はexecv、同様の関数が何をするのか、そしてなぜコードの次の行が決して実行されないのかをすでに説明しています。論理的な次の質問は、親が子が完了したことをどのように検出する必要があるかということです。

子が実行されている間、親がまったく何もしない必要がある単純なケースでは、andの代わりにを使用しsystemます。forkexec

または、子が終了する前に親が何か他のことをする場合、これらは重要なポイントです。

  • 子が終了すると、親はを取得しSIGCHLDます。のデフォルトのハンドラーSIGCHLDはignoreです。その信号をキャッチしたい場合は、を呼び出す前にハンドラーをインストールしてforkください。
  • 子が終了した後、親はwaitpid子をクリーンアップし、その終了ステータスが何であったかを確認するために呼び出す必要があります。
  • 親は、子が終了するまで待機するために、waitまたはブロッキングモードで呼び出すこともできます。waitpid
  • 親はwaitpid、非ブロッキングモードで呼び出して、子がまだ終了しているかどうかを確認することもできます。
于 2011-03-02T19:39:31.237 に答える
0

何が起こると思いましたか?これが何をするかexecvです。次のようなドキュメントをお読みください。

exec()ファミリーの関数は、現在のプロセスイメージを新しいプロセスイメージに置き換えます。

おそらく、現在のプロセスに加えsystemて新しいプロセスを生成するように環境に要求するために、何かを求めていたのでしょう。または..それはあなたがすでに達成したことではありませんか?ここで何を達成したいのかわかりません。fork

于 2011-03-02T19:26:01.650 に答える