|
>>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 でブロックさせたくないという意図だったのですね。 読み違えておりました。 |
|
こんにちは 質問があってきました Perlを使っていると system関数やexec関数を使うようになりました 便利でとてもよいのですが Root権限でコマンドが実行されているような気がします くわしくはまだ確認していません。 また、CGIでファイルマネージャーを使っていますが これも同じようにパスワードファイルなどを開かれるという欠点があります 全ディレクトリやファイルのパーミッションを000にすることはもちろんできませんし 一部だけのパーミッション設定もだめです 例)/homeを000にするが/home/userが777だとアクセスされてしまう これらのことからセキュリティーホールとなっていてとても不安です これらについての対処法はなにかないでしょうか? |