UNIXのコマンドの大部分は,標準入力(キーボード)からデータを受け取り,標準出力(ディ スプレイ) に処理した結果を出力するようになっている.例えば,
ls -l
複数のコマンドを使って,処理したいデータがある場合,UNIXではコマンドを接続するこ とができる.標準出力から出てくるデータを次のコマンドの標準入力に渡すのである.例 えば,
ls -l | sort -n +4
このようにコマンドを連結する機能をパイプラインという.そして,連結する | を パイプという.あたかも,パイプにデータが流れているかのようである.もちろん,2個 以上のコマンドの連結が可能である.このようにパイプを使ってコマンドをつなぐことに より,UNIXではかなり複雑な動作も簡単に記述できる.
パイプを開くためには,ファイルポインターをつかう.そのためファイルポインターを格 納すの変数を用意しなくてはならない.パイプの先もファイルとして扱われるのである.
FILE *hoge;
次にgnuplotを立ち上げて,そこにパイプを接続する必要がある.パイプの情報のファイ ルポインターで示される.
popen()関数がパイプを開く命令である.これで,gnuplot が立ち上がり,パイプを 通して,コマンドを送ることができる.オプションのpersistで,gnuplotが終了し てもグラフが残るようにしている.そうしないと,コンピューターの動作は高速なので, gunplotは一瞬にして終了し,グラフが消えてしまい,ほとんど動作内容が分からなく なる.
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 *hoge;
5
6 hoge = popen("gnuplot -persist","w");
7 fprintf(hoge, "plot sin(x)\n");
8
9 pclose(hoge);
10
11 return 0;
12 }
1 #include <stdio.h>
2
3 int main(void){
4 FILE *data, *gp;
5 int i, imax=20;
6 double x=-5.0, dx, y;
7 char *data_file;
8
9 /*------ データファイル作成 ---------- */
10
11 data_file="out.dat";
12 data = fopen(data_file,"w");
13
14 dx=10.0/imax;
15
16 for(i=0; i<=imax; i++){
17 if(x<-1){
18 y=-1.0;
19 }else{
20 y=1.0;
21 }
22
23 fprintf(data,"%f\t%f\n", x, y);
24 x+=dx;
25 }
26
27 fclose(data);
28
29 /*------ グラフの作成 ---------- */
30
31 gp = popen("gnuplot -persist","w");
32 fprintf(gp, "set xrange [-5:5]\n");
33 fprintf(gp, "set yrange [-1.5:1.5]\n");
34 fprintf(gp, "set pointsize 2\n");
35 fprintf(gp, "plot \"%s\" using 1:2 with linespoints 1 4 \n", data_file);
36 pclose(gp);
37
38 return 0;
39 }
1 #include <stdio.h>
2 #include <math.h>
3 void mk_triangle_data(char *a, double x1, double x2, int n);
4 void mk_graph(char *f, char *xlb, double x1, double x2,
5 char *ylb, double y1, double y2);
6
7 /*==========================================================*/
8 /* main function */
9 /*==========================================================*/
10 int main(void){
11
12 double pi = 4*atan(1);
13
14 mk_triangle_data("out.txt", -2*pi, 2*pi, 1000);
15 mk_graph("out.txt", "x", -2*pi, 2*pi, "y", -3, 3);
16
17 return 0;
18 }
19
20 /*==========================================================*/
21 /* make a data file */
22 /*==========================================================*/
23 void mk_triangle_data(char *a, double x1, double x2, int n){
24 double x, dx;
25 double y1, y2, y3;
26 int i;
27 FILE *out;
28
29 dx = (x2-x1)/n;
30
31 out = fopen(a, "w");
32
33 for(i=0; i<=n; i++){
34 x = x1+dx*i;
35 y1 = sin(x);
36 y2 = cos(x);
37 y3 = tan(x);
38
39 fprintf(out, "%e\t%e\t%e\t%e\n", x, y1, y2, y3);
40 }
41
42 fclose(out);
43 }
44
45 /*==========================================================*/
46 /* make a graph */
47 /*==========================================================*/
48 void mk_graph(char *f, char *xlb, double x1, double x2,
49 char *ylb, double y1, double y2)
50 {
51
52 FILE *gp;
53
54 gp = popen("gnuplot -persist","w");
55
56 fprintf(gp, "reset\n");
57
58 /* ------- set x grid ---------*/
59
60 fprintf(gp, "set grid\n");
61
62 /* ------- set x axis ---------*/
63
64 fprintf(gp, "set xtics 1\n");
65 fprintf(gp, "set mxtics 10\n");
66 fprintf(gp, "set xlabel \"%s\"\n", xlb);
67 fprintf(gp, "set nologscale x\n");
68 fprintf(gp, "set xrange[%e:%e]\n", x1, x2);
69
70 /* ------- set y axis ---------*/
71
72 fprintf(gp, "set ytics 1\n");
73 fprintf(gp, "set mytics 10\n");
74 fprintf(gp, "set ylabel \"%s\"\n", ylb);
75 fprintf(gp, "set nologscale y\n");
76 fprintf(gp, "set yrange[%e:%e]\n", y1, y2);
77
78 /* ------- plat graphs ---------*/
79
80 fprintf(gp, "set terminal x11\n");
81
82 fprintf(gp, "plot \"%s\" using 1:2 with line,\
83 \"%s\" using 1:3 with line,\
84 \"%s\" using 1:4 with line\n", f, f, f);
85
86 fprintf(gp, "set terminal emf\n");
87 fprintf(gp, "set output \"tri.emf\"\n");
88
89 fprintf(gp, "replot\n");
90
91 pclose(gp);
92 }