(私はシンプルexpect様のプログラムを開発しています。)終了した子プロセスの終了状態をシェルに正しく渡す方法はありますか?
たとえばは私がfork()
とexec()
別のプログラムprog2
プログラムprog1.c
を持っています。 prog2
がシグナル(例えば、SIGPIPE
)によって殺された場合、prog1
は、waitpid()
,WIFSIGNALED()
およびWTERMSIG()
でその終了状態を得ることができる。その後、prog1
はprog1
の呼び出し元(BashやKsh93のようなシェル)に終了状態を渡し、prog2
を呼び出すシェルのように見せたいので、シェルで正確な終了状態をprog2
にします。
prog1
は、prog2
を殺した信号で自分自身を殺しますが、これはちょっと奇妙に聞こえるので、これを行うにはもっと良い方法があるかどうかを知りたいと思っています。
報告されたステータスが正確(シグナルのステータスも)であるようにするには、あなたが提案したものと正確に一致する必要があります。 int corpse = wait(&status); if(WIFSIGNALED(status))kill(getpid()、TERMSIG(status)); else exit(WEXITSTATUS(status)); '。 Bashは、通常128 + signal_numberで終了することによって、シグナルによる死を報告します。コアダンプにはまだ問題があるかもしれません。また、いくつかの信号(ジョブ制御信号など)を扱う必要があるかもしれません。 –
私は子供が出てくるシナリオだけを扱うので、 'WIFSTOPPED'や' WIFCONTINUED'のようなものは扱えません。コアダンプは確かに私が考える必要があるものです。 Cプログラムがコアをダンプするかどうかを決めることができるのかどうかは分かりませんが、依然として呼び出し側に 'SIGSEGV 'が実行されていることを伝えることができます。 – pynexj
場合によっては、コアダンプを制御するためのo/s固有のインタフェースがあります(コアサイズの制限は0など)。信号が最初に孫プロセスにコアダンプを与えた場合、おそらく子プロセスにも当てはまりますが、それは子供のコアが孫のコアを上書きし、関連情報なしであなたを残すため問題になる可能性があります。私はあなたがそれについて心配する必要があるか、またはあなたがo/s特有の仕組みでそれを扱うことができるかについてはっきりしていません。コアが作成されていなくても「コアダンプされた」ビットがセットされるかどうかは分かりません。おそらくない。 –