「C言語 プロセスの生成 ( fork ) と パイプによるプロセス間通信 ( pipe )」では、プロセスの生成に fork と execl システムコールを使用しましたが、ここでは、popen を使用してプロセスを生成し、その出力結果を取得するサンプルを掲載しています。
スポンサーリンク
popen を使用してプロセスを実行するサンプルコード
#include <stdio.h> #include <stdlib.h> int main(int argc, char** argv) { FILE* fp; char buf[1024]; char* cmd = "/usr/bin/ls -l /"; if ((fp = popen(cmd, "r")) != NULL) { while (fgets(buf, sizeof(buf), fp) != NULL) { printf("%s", buf); } pclose(fp); return 0; } return -1; }
実行結果
# gcc popen_r.c # ./a.out 合計 360 drwxr-xr-x 2 root root 512 1月 12日 09:27 Desktop drwxr-xr-x 2 root root 512 8月 10日 2010年 Documents lrwxrwxrwx 1 root root 9 8月 10日 2010年 bin -> ./usr/bin ・ ・ ・
プロセスを非同期に実行する
前述のサンプルコードでは popen で実行したプロセスが終了するまでは制御が返されません。実行したプロセスの終了を待機したくない場合は、通常のシェルと同様にコマンドの最後に & を つけて、バックグラウンドで実行させればよいです。ただし、生成したプロセスの出力内容は取得することができません。
#include <stdio.h> #include <stdlib.h> int main(int argc, char** argv) { int i; char* cmd = "/usr/bin/sleep 10 &"; for(i=0; i<10; i++) { printf("create sleep process\n"); process_start(cmd); } printf("sleeping......\n"); sleep(20); printf("wake up\n"); } int process_start(const char *cmd) { FILE *p; if ((p = popen(cmd, "w")) == NULL) { return -1; } pclose(p); return 0; }