コマンドライン引数でデータを出力する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にデータを貯めておくというのが面白くないですか?