さまよう大アリクイ

横浜市に住む。ホームページを作っていたりするが、最近滞り気味。

pipeにデータを貯めてexecする

コマンドライン引数でデータを出力するAPIのプログラムから、標準入力でデータを入力するAPIのプログラム(仮にNSCAと呼ぶ)へデータを渡すことになった。単純な方法は、以下のシェルスクリプトを作ること。

#!/bin/sh

echo $1 | NSCA

シェルを立ち上げるのは重いかなぁと思って作った簡単なCのプログラムです(エラー処理は省略)。popenでNSCAを起動し、NSCAの標準入力に引数の値を書き込む仕組みです。

#include

#include

void main(int argc, char **argv)

{

    FILE *fp;

    fp=popen("NSCA","w"); // fpはNSCAの標準入力へのファイルポインタ

    fputs(argv[1],fp);    // NSCAの標準入力へ引数を渡す。

    pclose(fp);

}

引数1つを渡すのに、forkでプロセスを生成するのは重たそうな気がして、さらに作り直してみたのがこのプログラムです(エラー処理は省略)。標準入力に対するパイプを作りパイプ内に引数を入れておきます。そしてexecで起動したNSCAがパイプに貯めたデータを読込む仕組み。これだと追加プロセスの数が少なくて済みます。

#include

#include

void main(int argc, char **argv)

{

    int p[2];

    pipe(p);                  // pipeを作り

    dup2(p[0], 0);            // 読込み側を標準入力へ接続

    close(p[0]);              // 余計なファイルディスクプリタはクローズ

    write(p[1], argv[1], strlen(argv[1]) ); // パイプへ引数を貯める

    close(p[1]);              // パイプへの出力終わり

    execl("/usr/bin/NSCA", "NSCA", NULL); // NSCA実行

}

pipeにデータを貯めておくというのが面白くないですか?