posix_spawn
最近ではおそらく推奨されるソリューションです。
fork()
それ以前execXX()
は、これを行う方法でした (は、、、、、およびを含む関数ファミリーのexecXX
1 つです)。現在、GNU C ライブラリでは、少なくとも Linux ではfork/exec を介して実装されています。Linux にはシステム コールがありません。exec
execl
execlp
execle
execv
execvp
execvpe
posix_spawn
posix_spawn
fork()
(または) を使用vfork()
して、親のクローンとなる別のプロセスを起動します。子プロセスと親プロセスの両方で実行は続行fork
されますが、どちらの場合も異なる値が返されるため、区別できます。execXX()
その後、子プロセス内から関数の 1 つを使用できます。
ただし、この問題に注意してください-私のブログ投稿の1つから借用したテキスト( http://davmac.wordpress.com/2008/11/25/forkexec-is-forked-up/ ):
別のプロセスを並行して実行し、 exec() 呼び出しが成功したことを確認するための単純な標準準拠の方法 (または一般的に移植可能な方法) はないようです。問題は、いったん fork()d してから exec()d に成功すると、親プロセスと通信して exec() が成功したことを通知できないことです。exec() が失敗した場合、(たとえばシグナルを介して) 親と通信できますが、成功を通知することはできません。親が exec() の成功を確認できる唯一の方法は、子を待つことです。終了するプロセス (および失敗の兆候がないことを確認する) と、もちろん並列実行ではありません。
つまり、execXX()
成功した場合、制御できなくなるため、元の (親) プロセスに成功を知らせることができません。
あなたの場合の問題である場合、この問題の潜在的な解決策:
[...] pipe() を使用してパイプを作成し、出力終了を close-on-exec に設定し、次に fork() (または vfork())、exec() を使用して、何か (おそらく errno) をexec() が失敗した場合 (_exit() を呼び出す前) にパイプします。親プロセスはパイプから読み取ることができ、exec() が成功した場合はすぐに入力の終わりを取得し、exec() が失敗した場合はデータを取得します。
(子プロセスが親プロセスよりも低い優先度で実行され、親がそこからの出力を待機する場合、このソリューションは優先度の逆転を引き起こす傾向があることに注意してください)。
posix_spawn
上記および他の回答にもありますが、とにかく fork/exec に関して実装されることが多く、exec()
ステージが失敗する前に成功を返す可能性があるため、子実行可能ファイルの実行の失敗を検出する問題は解決しません。