[ C言語 ] プロセスの実行と出力結果の取得 ( popen )

Pocket

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

 

スポンサーリンク


Pocket

Leave a Comment

Your email address will not be published. Required fields are marked *