C ++ одновременно управляет вводом / выводом другой программы - PullRequest
2 голосов
/ 08 мая 2011

Я управляю 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-терминал.

1 Ответ

4 голосов
/ 08 мая 2011

Я нашел этот готовый к использованию ответ: Может ли popen () создавать двунаправленные трубы, такие как pipe () + fork ()?

В pfunc, который вы поставляете, выдолжен dup2 файловые дескрипторы, полученные в качестве аргументов для stdin stdout, а затем 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

Я пропустил любую проверку ошибок.

...