2017-11-02 10 views
0

私はシンプル様のプログラムを開発しています。終了した子プロセスの終了状態をシェルに正しく渡す方法はありますか?

たとえばは私がfork()exec()別のプログラムprog2プログラムprog1.cを持っています。 prog2がシグナル(例えば、SIGPIPE)によって殺された場合、prog1は、waitpid(),WIFSIGNALED()およびWTERMSIG()でその終了状態を得ることができる。その後、prog1prog1の呼び出し元(BashやKsh93のようなシェル)に終了状態を渡し、prog2を呼び出すシェルのように見せたいので、シェルで正確な終了状態をprog2にします。

prog1は、prog2を殺した信号で自分自身を殺しますが、これはちょっと奇妙に聞こえるので、これを行うにはもっと良い方法があるかどうかを知りたいと思っています。

+0

報告されたステータスが正確(シグナルのステータスも)であるようにするには、あなたが提案したものと正確に一致する必要があります。 int corpse = wait(&status); if(WIFSIGNALED(status))kill(getpid()、TERMSIG(status)); else exit(WEXITSTATUS(status)); '。 Bashは、通常128 + signal_numberで終了することによって、シグナルによる死を報告します。コアダンプにはまだ問題があるかもしれません。また、いくつかの信号(ジョブ制御信号など)を扱う必要があるかもしれません。 –

+0

私は子供が出てくるシナリオだけを扱うので、 'WIFSTOPPED'や' WIFCONTINUED'のようなものは扱えません。コアダンプは確かに私が考える必要があるものです。 Cプログラムがコアをダンプするかどうかを決めることができるのかどうかは分かりませんが、依然として呼び出し側に 'SIGSEGV 'が実行されていることを伝えることができます。 – pynexj

+0

場合によっては、コアダンプを制御するためのo/s固有のインタフェースがあります(コアサイズの制限は0など)。信号が最初に孫プロセスにコアダンプを与えた場合、おそらく子プロセスにも当てはまりますが、それは子供のコアが孫のコアを上書きし、関連情報なしであなたを残すため問題になる可能性があります。私はあなたがそれについて心配する必要があるか、またはあなたがo/s特有の仕組みでそれを扱うことができるかについてはっきりしていません。コアが作成されていなくても「コアダンプされた」ビットがセットされるかどうかは分かりません。おそらくない。 –

答えて

0

コメントを回答に変換します。

あなたが報告される状態は(あまりにも信号の状態)正確にしたい場合は、あなたが提案して正確に何を持っていますが:bashが正常に終了することにより、信号による子どもの死亡が報告さ

int status; 
int corpse = wait(&status); 
if (WIFSIGNALED(status)) 
    kill(getpid(), TERMSIG(status)); 
else 
    exit(WEXITSTATUS(status)); 

注意128 + signal_numberとなります。コアダンプにはまだ問題があるかもしれません。また、ジョブ制御信号などの信号を少し異なる方法で処理する必要があるかもしれません。

私は子供が退室するシナリオでのみ、WIFSTOPPEDまたはWIFCONTINUEDのようなものは処理できません。コアダンプは確かに私が考える必要があるものです。 Cプログラムがコアをダンプするかどうかを決定できても、依然として呼び出し元にSIGSEGVされていることを伝えることができるかどうかは不明です。

コア・ダンプを制御するために、時にはo/s固有のインターフェースがあります。例えば、POSIXはgetrlimit()setrlimit()を提供します。これは、コアダンプのサイズを0に制限し、コアダンプを防止します。信号が最初に孫プロセスにコアダンプを与えた場合、おそらく子プロセスにも当てはまりますが、それは子供のコアが孫のコアを上書きし、関連情報なしであなたを残すため問題になる可能性があります。私はあなたがそれについて心配する必要があるか、またはあなたがo/s特有の仕組みでそれを扱うことができるかについてはっきりしていません。コアが作成されていなくても「コアダンプされた」ビットがセットされるかどうかは分かりません。おそらくない。

関連する問題