「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;
}