2018/01/24

[c/c++]popen()で実行した結果はpclose()の戻り値で判定する

コマンドの結果が標準出力で出てくるので、それを別のプログラムで呼び出して、結果を加工しようとした。

そういうときは、popen()で取ってくると良いようである。

https://linuxjm.osdn.jp/html/LDP_man-pages/man3/popen.3.html


これを"r"で開いた場合、戻り値のFILE*で標準出力に吐き出された内容が取ってこれる。
バッファにためてやらないといかんが、まあよかろう。


さて、そのコマンドはエラーを返すこともある。
エラーはreturnで返しているので、コンソールから実行すると「echo $?」などすれば見える。
しかし、popen()の場合はどうしたらよいのだろうか?


結果としては、pclose()の戻り値を、wait()を使ったときの要領で判定していくようだ。


        int ret = pclose(fp);
         if (WIFEXITED(ret)) {
             printf("WIFEXITED\n");
             printf("WEXITSTATUS=%d\n", WEXITSTATUS(ret));
         }
         if (WIFSIGNALED(ret)) {
             printf("WIFSIGNALED\n");
             printf("WTERMSIG=%d\n", WTERMSIG(ret));
#ifdef WCOREDUMP
             if (WCOREDUMP(ret)) {
                 printf("WCOREDUMP\n");
             }
#else
             printf("WCOREDUMP not defined\n");
#endif
         }
         if (WIFSTOPPED(ret)) {
             printf("WIFSTOPPED\n");
             printf("WSTOPSIG=%d\n", WSTOPSIG(ret));
         }
         if (WIFCONTINUED(ret)) {
             printf("WIFCONTINUED\n");
         }

これを調べる前だったので、実装は呼び出すコマンドの方を加工して、エラーの時は何も出力しない、ということにした。
そうすれば、strlen()でわかるからいいや、と思ったのだ。

が、pclose()の戻り値を見るようにした方がまっとうですな。

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。