C ++同时控制另一个程序的I / O.

时间:2011-05-08 14:18:58

标签: c++ linux input pipe

我在我的程序中控制Gnuplot进行拟合和绘图;但是,为了获得拟合参数,我想使用Gnuplot的打印功能:

FILE *pipe = popen("gnuplot -persist", "w");
fprintf(pipe, "v(x) = va_1*x+vb_1\n");
fprintf(pipe, "fit v(x) './file' u 1:2 via va_1,vb_1 \n")
fprintf(pipe, "print va_1"); // outputs only the variable's value as a string to
                             // a new line in terminal, this is what I want to get
...
pclose(pipe);

我已经阅读了很多关于popen()fork()等等的内容,但是这里或其他网站上的答案要么缺乏透彻的解释,与我的问题无关,要么太难以解决明白(我刚刚开始编程)。

仅供参考:我正在使用Linux,g ++和通常的gnome-terminal。

1 个答案:

答案 0 :(得分:4)

我找到了这个随时可用的答案:Can popen() make bidirectional pipes like pipe() + fork()?

在您提供的pfunc中,您必须dup2收到的文件描述符作为stdinstdout以及exec gnuplot的参数,例如:

#include <unistd.h>

void gnuplotProcess (int rfd, int wfd)
{
   dup2( STDIN_FILENO, rfd );
   dup2( STDOUT_FILENO, wfd );
   execl( "gnuplot", "gnuplot", "-persist" );
}

int fds[2];
pid_t gnuplotPid = pcreate(fds, gnuplotProcess);
// now, talk with gnuplot via the fds

我省略了任何错误检查。