コマンドの結果が標準出力で出てくるので、それを別のプログラムで呼び出して、結果を加工しようとした。
そういうときは、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 件のコメント:
コメントを投稿
コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。
注: コメントを投稿できるのは、このブログのメンバーだけです。