CのプログラムからGNUPLOTを動かす方法

Last modified: Fri Mar 12 23:57:36 JST 1999

コンピュータシミュレーションなんかをガリガリやってると、

「プログラムの実行中にリアルタイムでグラフを描かせたい」
なんて思うことはありませんか? もちろん、X を使うプログラムを自分で書けばこの希望を叶えることができるわけですが、「そんなタイソウなもんはいらん」「面倒くさい」というあなたには、
「プログラムからGNUPLOTを呼び出してグラフを描かせる」
という方法もあります。ここではC言語でこのような操作を実現する方法を説明します。

えらそうに書いてますが、なんのことはない、popen(3)を使うだけです。そう、それだけのことです。これでわかった人は、これ以上読み続けても時間の無駄です。自分でさっさと作ってみて下さい。(^^;


さて、popen(3)のマニュアルを見てみましょう。例えば FreeBSD 2.2.8-RELEASE のマニュアルはこうなっています。

% man 3 popen

POPEN(3)                   UNIX Programmer's Manual                   POPEN(3)

NAME
     popen, pclose - process I/O

SYNOPSIS
     #include <stdio.h>

     FILE *
     popen(const char *command, const char *type)

     int
     pclose(FILE *stream)

DESCRIPTION
     The popen() function ``opens'' a process by creating a bidirectional pipe
     forking, and invoking the shell.  Any streams opened by previous popen()
                                      :
このpopenを使えば、CのプログラムからGNUPLOTを起動し、そのプロセスとデータのやりとりをできるわけです。

例えばこんなプログラム:

     1  #include <stdio.h>
     2  #include <stdlib.h>
     3
     4  #define GNUPLOT_PATH "/usr/local/bin/gnuplot"
     5
     6  int main()
     7  {
     8      FILE *gp;
     9      
    10      gp = popen(GNUPLOT_PATH, "w");
    11      if(gp == NULL){
    12          fprintf(stderr, "Oops, I can't find %s.", GNUPLOT_PATH);
    13          exit(EXIT_FAILURE);
    14      }
    15      fprintf(gp, "plot sin(x)\n");
    16      fflush(gp); /* Don't forget to flush the buffer. */
    17      getchar();
    18      pclose(gp);
    19
    20      exit(EXIT_SUCCESS);
    21  }
10行目でGNUPLOTのプロセスをオープンし、15行目でそいつに``plot sin(x)\n''を送ってます。これで、GNUPLOTのウインドウが現れて sin(x) のグラフを描いてくれるはずです。この仕組みが分かってしまえば、あとは応用していろんなことができますね。

つづく…(^^;

up 目次へ