揮発性のメモ2

知識をメモ書きしておく

標準出力と戻り値を両方取る

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 $?