popen()で開いたプロセスの戻り値(exitとかreturnで返してる値)はpclose()で取得できることを今日知った。
Man page of POPEN
Man page of WAIT
もっと早くに知っときたかったな・・・
実験したプログラム
#include <stdio.h> #include <sys/wait.h> int main(int argc, char **argv) { FILE *fp; char buf[256]; int result; if( fp=popen(argv[1],"r") ){ while( fgets(buf,sizeof(buf),fp) ){ printf("r:%s",buf); } result = pclose(fp); printf("result:%d\n",result); if( WIFEXITED(result) ){ printf("ERROR:%d\n",WEXITSTATUS(result)); } if( WIFSIGNALED(result) ){ printf("SIGNAL:%d\n",WTERMSIG(result)); } }else{ perror("popen"); } return 0; }
popen()がエラーを返すことはまず無い。コマンドを間違えて書いてもシェルが起動できないわけではないのでpopen()は正常に動作する(command not foundにはなるけど)。 popen()がエラーを返してきたらFATALなレベル
$ ./popentest "sleep 5" result:0 ERROR:0
みたいな感じでテストしてみる。エラーになれば検出できるし、誰かがkillすればSIGNALも見れる。
main(int argc, char **argv){ return atoi(argv[1]); }
returnされた値をシェルで見たいときは echo $?