UNIXのコマンドの大部分は,標準入力(キーボード)からデータを受け取り,標準出力(ディ スプレイ) に処理した結果を出力するようになっている.例えば,
ls -l
複数のコマンドを使って,処理したいデータがある場合,UNIXではコマンドを接続するこ とができる.標準出力から出てくるデータを次のコマンドの標準入力に渡すのである.例 えば,
ls -l | sort -n -k +5
このようにコマンドを連結する機能をパイプラインという.そして,連結する | を パイプという.あたかも,パイプにデータが流れているかのようである.もちろん,2個 以上のコマンドの連結が可能である.このようにパイプを使ってコマンドをつなぐことに より,UNIXではかなり複雑な動作も簡単に記述できる.
パイプを開くためには,ファイルポインターをつかう.そのためファイルポインターを格 納する変数を用意しなくてはならない.パイプの先もファイルとして扱われるのである.
FILE *hoge;
次にgnuplotを立ち上げて,そこにパイプを接続する必要がある.次のようにする.
popen()関数がパイプを開く命令である.これで,gnuplot が立ち上がり,パイプを 通して,コマンドを送ることができる.オプションのpersistで,gnuplotが終了し てもグラフが残るようにしている.そうしないと,コンピューターの動作は高速なので, gnuplotは一瞬にして終了し,グラフが消えてしまい,ほとんど動作内容が分からなく なる.popen()関数の戻り値はパイプの情報を示すファイルポインターである.この ファイルポインターを指定して,コマンドを送ることになる.以前,学習したファイル操 作とほとんど同じである.
hoge = popen("gnuplot -persist","w");
パイプを通して,gnuplotにコマンドを送るのはfprintf()関数を使う.
このfprintfを使って,gnuplotにいくらでもコマンドを送ることができる.あたか も,C言語の向こう側でgnuplotが立ち上がって,それから命令を送っているかのように動 作する.このようなことができるのが,コマンドを打ち込むCharacter-based User Interface(CUI)の良いところである.
fprintf(hoge, "plot sin(x)\n");
すべての動作が終了したならば,パイプを閉じなくてはならない.これも,ファイルの操 作と全く同じである.
pclose(hoge);
1 #include <stdio.h>
2
3 int main(void){
4 FILE *gp;
5
6 gp = popen("gnuplot -persist","w");
7 fprintf(gp, "plot sin(x)\n");
8
9 pclose(gp);
10
11 return 0;
12 }
plot '-' [オプション]とする.
fprintf(パイプを表すファイルポインター,データの並び)とする.
fprintf(パイプを表すファイルポインター,"e\n")とする.
1 #include <stdio.h>
2 #include <math.h>
3 #define NX 720
4
5 int main(void){
6 FILE *gp;
7 int i;
8 double dx, x[NX+1], y[NX+1];
9
10 /* ---- データ作成 ---- */
11 dx=4*M_PI/NX;
12 for(i=0; i<=NX; i++){
13 x[i]=-2*M_PI+i*dx;
14 y[i]=sin(x[i]);
15 }
16
17 /* ---- グラフ作成 ---- */
18 gp = popen("gnuplot -persist","w");
19 fprintf(gp, "set xrange [-6.5:6.5]\n");
20 fprintf(gp, "set yrange [-1.5:1.5]\n");
21 fprintf(gp, "plot '-' with lines linetype 1 title \"sin\"\n");
22
23 for(i=0; i<=NX; i++){
24 fprintf(gp,"%f\t%f\n", x[i], y[i]); // データの書き込み
25
26 }
27 fprintf(gp,"e\n");
28
29 pclose(gp);
30
31 return 0;
32 }
plot "ファイル名" [オプション]と直接,ファイル名を指定指定したコマンドを送る.
1 #include <stdio.h>
2 #include <math.h>
3 #define NX 720
4
5 int main(void){
6 FILE *data, *gp;
7 char *data_file;
8 int i;
9 double dx, x, y;
10
11 /*------ データファイル作成 ---------- */
12 data_file="out.dat";
13 data = fopen(data_file,"w");
14
15 dx=4*M_PI/NX;
16 for(i=0; i<=NX; i++){
17 x=-2*M_PI+i*dx;
18 y=sin(x);
19 fprintf(data,"%f\t%f\n", x, y);
20 }
21 fclose(data);
22
23 /*------ グラフの作成 ---------- */
24 gp = popen("gnuplot -persist","w");
25 fprintf(gp, "set xrange [-6.5:6.5]\n");
26 fprintf(gp, "set yrange [-1.5:1.5]\n");
27 fprintf(gp, "plot \"%s\" with lines linetype 1 title \"sin\"\n",data_file);
28 pclose(gp);
29
30 return 0;
31 }