code-1839406_640


CやC++でコマンドを実行(サブプロセスを起動)する標準的な関数としてsystemとpopenがあります。

これらの関数を使っているコードを読んでいるとどういった基準で使い分けをしているのか分からなかったため、今回はsystemとpopenの使い分け方について調べてみました。





まずは結論

まずは結論です。

コマンドを実行したいだけなら「system」を使うべき。

コマンドの実行結果を取得したい場合は「popen」を使うのが有効。


以下にsystemとpopenを使用してコマンドを実行するサンプルコードとそれぞれのメリット、デメリットを記していきます。


system関数でコマンドを実行するサンプル


#include 
#include 

int main(void){
    int ret = 0;
    
    ret = system("rm -f test.txt");
    if (ret == -1){
        printf("ERROR\n");
    }

    return 0;
}



system関数のメリットとデメリット


メリット


  • popenと比べてコードが簡易的なため書き間違いを防ぎやすい

デメリット


  • 実行結果を取得するためには実行結果を一度ファイルに出力するなど工夫が必要
  • popen(コマンド, "w")のように標準入力にデータを与えることができない






popen関数でコマンドを実行するサンプル


#include 
#include 

#define BUF 256

int main(void){
    FILE *fp;
    char buf[BUF];

    fp = popen("pwd", "r");
    if (fp == NULL){
        printf("ERROR");
        return -1;
    }
    
    while(fgets(buf, BUF, fp) != NULL){
        fputs(buf, stdout);
    }
    pclose(fp);

    printf("buf = %s\n", buf);

    return 0;
}



popen関数のメリットとデメリット


メリット

  • 実行結果の取得がファイル読み込みの操作と同じ要領でできる
  • system関数と違い標準入力にデータを与えることが可能


デメリット

  • ploseの書き忘れによりメモリリークの恐れがある



最後に


もしこの記事を読んだ人の中でsystemとpopenに他にもメリットやデメリットがあるということを知っている方がいれば、コメントで教えていただければ幸いです。