1

次のようなコードがあるとします。

int pipes[2];
pipe(pipes);
pid_t p = fork();
if(0 == p)
{
   dup2(pipes[1], STDOUT_FILENO);
   execv("/path/to/my/program", NULL);
   ...
}
else
{
//... parent process stuff
}

ご覧のとおり、パイプを作成し、分岐し、パイプを使用して子の出力を読み取ります (popen他の目的で子プロセスの PID も必要になるため、ここでは使用できません)。

execv質問は、上記のコードで失敗した場合、どうすればよいですか? exit() または abort() を呼び出す必要がありますか? 私の知る限り、これらの関数は開いているファイル記述子を閉じます。-ed プロセスは親のファイル記述子を継承するためfork、親プロセスが使用するファイル記述子が使用できなくなるということですか?

UPD

問題は exec() によってロードされた実行可能ファイルが失敗することではなく、たとえば最初の引数によって参照されるファイルが見つからないか実行可能でない場合など、exec 自体に関することであることを強調したいと思います。

4

3 に答える 3

3

を使用exit(int)して親プロセスが引数の(下位バイト)を読み取ることができるため、使用する必要がありますwaitpid()。これにより、親プロセスでエラーを適切に処理できます。_exitプログラムの機能によっては、の代わりに使用したい場合がありますexit。違いは、_exit登録された関数を実行せず、atexitstdio ストリームをフラッシュしないことです。

于 2012-06-26T21:20:14.123 に答える
0

execv()失敗する可能性のある理由は十数個あり、それぞれを異なる方法で処理する必要がある場合があります。

失敗した子が親のファイル記述子に影響を与えることはありません。これらは、事実上、参照カウントされます。

于 2012-06-26T21:11:28.247 に答える
0

に電話する必要があります_exit()。すべての機能を実行しますexit()が、登録された関数の呼び出しを回避しatexit()ます。呼び出し_exit()は、親が失敗した子の終了ステータスを取得し、必要な手順を実行できることを意味します。

于 2012-06-26T21:22:22.153 に答える