6

if(pid == 0)
{
      execvp(cmd, args);
      // printf("hello"); // apparently, putting this or not does not work.
      _exit(-1);
}
else
{
      // parent process work
}

「execvp()」は、現在のプログラムを実行予定のプログラムに置き換えます(もちろん同じプロセスコンテキストで)。したがって、たとえば、execvp()の後にprintf()を呼び出すと、機能しなくなります。それはドキュメントが言っていることであり、私もそれを検証しました。

しかし、なぜ_exit()が必要なのですか..?コントロールがexecvp()の後にステートメントに戻るということは起こりますか?

どんなポインタにも感謝します。

ありがとう

4

4 に答える 4

6

失敗した場合、関数は戻ります。

exec関数の1つが呼び出し元のプロセスイメージに戻る場合、エラーが発生しています。戻り値は-1であり、エラーを示すためにerrnoが設定されます。

_exit()、execが失敗した場合でも、プロセスを適切に終了し、終了コードを返すことを可能にします。

于 2010-05-19T07:03:40.307 に答える
2

execve()システムコールは失敗する可能性があります。これを行う典型的な理由は、ファイルが存在しないか、実行可能でない場合です。execvp()ラップアラウンドexecve()して、パス検索とデフォルトの環境処理を追加します (事実上常に必要なものです!)。そのため、別のいくつかの失敗モードが追加されます。特に、ユーザーのパスにない単純な名前で何かを実行しようとします。いずれにせよ、失敗は失敗であり、問​​題が発生したことを報告し、(現在は役に立たない) 子プロセスを回避する以外に、できることはあまりありません。(最も簡単なエラー報告方法は、おそらく を使用してエラー メッセージを出力することですperror()が、他にもあります。)

_exit()通常の方法とは対照的に必要な理由exit()は、子プロセスを終了したい、親プロセスに関連付けられた登録済みのクリーンアップ コードを実行したくないためです。OK、その多くは無害かもしれませんが、さよならメッセージをソケットに書き込むなどのことを行うのは悪いことatexit()です。親プロセスにそのリソースについて心配させてください。子は基本的にスタック フレーム以外は何も所有しません。

于 2010-05-19T09:18:20.243 に答える
1

execvp失敗した場合、が_exit呼び出されます。

execvpのマニュアルページには次のように書かれています。

戻り値
exec()関数のいずれかが戻る場合、エラーが発生しています。戻り値は-1であり、グローバル変数errnoはエラーを示すように設定されます。

于 2010-05-19T07:05:02.637 に答える
0

注意すべきことの1つは、通常、プロセスの終了ステータスに署名を付けたくないということです(移植性が重要な場合)。は失敗時exec()に自由に -1 を返すことができますが、それを返すので、子コード内でその失敗を処理できます。

子の実際のステータスは、育てられ_exit()たものに応じて 0 ~ 255 になります。errno

于 2010-05-19T09:06:53.147 に答える