|
>>2984 SIGNAL シグナルの追加はカーネルを書き換えないと無理です。 シグナル以外の方法 (パイプ・共有メモリなど) で情報のやりとり をするのが正解でしょう。 と偉そうなことをいってますが、シグナルが足りず SIGXCPU を 使って逃げたことはあります。 |
|
親プロセスでforkした子プロセスの終了状態(終了コード)を、親プロセス が認識する方法があれば情報提供をお願いします。 ・親プロセスはwaitしません。 ・子プロセスは同じものが複数生成されます。(順次生成) ファイルへ子プロセスの結果を出力して親プロセスが参照したり、パイプ や共有メモリを使用してのプロセス間通信などの方法があるかと思いますが、子プロセスにはできる限り修正を加えない方法を探しています。 理想は子プロセスの終了時にイベントが発生し、waitのように変数に結果 が格納されるようなものです。 |
|
>>2986 koko > ファイルへ子プロセスの結果を出力して親プロセスが参照したり、パイプ > や共有メモリを使用してのプロセス間通信などの方法があるかと思いますが、 の方法を取らないのであれば、無理なんじゃないでしょうか。 |
|
>>2986 koko > ・親プロセスはwaitしません。 親でSIGCHLDを拾ってwaitpid()のオプションWNOHANGで チェックするのもダメですか? --- snip --- #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <signal.h> #include <time.h> #include <sys/wait.h> void handler(int sig) { int pid,status,code; while((pid=waitpid(-1,&status,WNOHANG))>0) { if(WIFEXITED(status)) { code = WEXITSTATUS(status); printf("child process:[%d] was exited with code:[%d]\n",pid,code); } } } int main(int argc,char *argv[]) { int i,pid,code; char buf[16]; struct sigaction sa; if(argc>1) { code = atoi(argv[1]); srand(code+time(0)); sleep(rand()%10); return code; } memset(&sa,0,sizeof(sa)); sa.sa_flags = SA_NOCLDSTOP; sa.sa_handler = handler; sigaction(SIGCHLD,&sa,0); for(i=0;i<10;i++) { if((pid=fork())<0) { perror("fork"); return -1; } if(pid) continue; sprintf(buf,"%d",i); if(execl("./a.out","./a.out",buf,0)<0) { perror("execl"); return -2; } } for(;;) sleep(1); return 0; /* never reaches */ } --- snip --- かなり適当ですが。 |
|
>>2988 hsj 他のHPを調査をしている中で「waitpidで子プロセスの終了コードが取得できれば解決できそうだ。」というのは私も感じました。 試してみたいと思います。 >>2987 68user 今回は、既存の子プロセス側のソースコードにできるだけ手を入れないという条件があるのですが、良い案がない場合にはやはりパイプを使用する事に なるかと思います。 ご回答頂き、ありがとうございました。 |
|
>>2986 koko > ・親プロセスはwaitしません。 ってのは親プロセスにも手を入れたくないという意味かと思った のですが、wait でブロックさせたくないという意図だったのですね。 読み違えておりました。 |