| Karim Belabas on Sun, 11 Jan 2004 19:42:28 +0100 |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
| Re: Using fifos for in/output |
* Bill Allombert <allomber@math.u-bordeaux.fr> [2004-01-08 20:26]:
> On Thu, Jan 08, 2004 at 02:15:33PM +0000, Prof. J. E. Cremona wrote:
> > [I am sending this to pari-dev, though I do not seem to have received
> > anything from pari-dev for ages. So this is partly a test to see if I
> > still subscribed to that.]
> >
> > A couple of months ago there were some interesting postings from Bill
> > and Karim about using a fifo (special unix file) for input. I am
> > interested in using a second fifo for output as well, either by
> > redirecting stout or by using write().
> >
> > I really want this to work from within a C/C++ program, so that I can
> > start up a gp process in the background, have my program occasionally
> > send it input lines via its input fifo and then pick up the (one-line)
> > output from its output fifo. This would be more efficient than my
> > current practice of starting a new "slave" gp for each such
> > calculation, and getting its output via a temporary (ordinary) file to
> > which gp directs its output.
>
> Maybe you can reuse code from pariGUIde,
> <http://sourceforge.net/projects/pariguide/>
> file gpcontroller.cpp,
> <http://cvs.sourceforge.net/viewcvs.py/*checkout*/pariguide/pariguide/pariguide/gpcontroller.cpp>
>
>
> It implement exactly this functionnality.
You may also be able to reuse the code from TeXmacs (see
hhtp://www.texmacs.org), in particular src/System/Link/pipe_link.cpp .
It works more or less like this:
#define IN 0
#define OUT 1
pipe (pp_in );
pipe (pp_out);
pipe (pp_err); pid = fork ();
if (pid==0) { // the child
close (pp_in [OUT]);
close (pp_out [IN ]);
close (pp_err [IN ]);
dup2 (pp_in [IN ], STDIN );
close (pp_in [IN ]);
dup2 (pp_out [OUT], STDOUT);
close (pp_out [OUT]);
dup2 (pp_err [OUT], STDERR);
close (pp_err [OUT]);
execl("gp", "-f", "-q", NULL);
} else { // main process
in = pp_in [OUT]; // STDIN of gp process
out = pp_out [IN ]; // STDOUT of gp process
err = pp_err [IN ]; // STDERR of gp process
close (pp_in [IN]);
close (pp_out [OUT]);
close (pp_err [OUT]);
}
Hope this helps,
Karim.
--
Karim Belabas Tel: (+33) (0)1 69 15 57 48
Dep. de Mathematiques, Bat. 425 Fax: (+33) (0)1 69 15 60 19
Universite Paris-Sud http://www.math.u-psud.fr/~belabas/
F-91405 Orsay (France) http://pari.math.u-bordeaux.fr/ [PARI/GP]