<div dir="ltr"><div>You have to exec the child and supply the args in case 0 after you dup the file descriptor to the STDIN_FILENO, 0, too, and set up its stdout and stderr how you want. Then there's the issue of the other file descriptors, which you should close in the child before you exec the binary. The environment, also, needs attention sometimes, for security.<br>
<br></div><div>What's a good online or printed resource for this stuff? I am thinking I have some W. Richard Stevens book that has all this, but there's a lot to remember to keep it secure unless it's a throw-away project.<br>
<br></div><div>It reminds me of Dan Bernstein's daemontools project. He thought that it should be possible to use programs that could do all this stuff for you.<br></div><br></div><div class="gmail_extra"><br><br><div class="gmail_quote">
On Fri, Apr 5, 2013 at 7:56 PM, Ed Cashin <span dir="ltr"><<a href="mailto:ecashin@noserose.net" target="_blank">ecashin@noserose.net</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div dir="ltr"><div>I was going to write this example before realizing it is probably online, and I found it here:<br><br><a href="http://pubs.opengroup.org/onlinepubs/9699919799/functions/pipe.html" target="_blank">http://pubs.opengroup.org/onlinepubs/9699919799/functions/pipe.html</a><br>
<br></div>... in the docs for standard pipe(2) behavior. It looks like the stuff after the ellipsis is in main or some other function whose beginning and end aren't shown.<br><br><pre><tt>#include <stdlib.h>
#include <unistd.h>
...
<br>
int fildes[2];
const int BSIZE = 100;
char buf[BSIZE];
ssize_t nbytes;
int status;
<br>
status = pipe(fildes);
if (status == -1 ) {
/* an error occurred */
...
}
<br>
switch (fork()) {
case -1: /* Handle error */
break;
<br>
case 0: /* Child - reads from pipe */
close(fildes[1]); /* Write end is unused */
nbytes = read(fildes[0], buf, BSIZE); /* Get data from pipe */
/* At this point, a further read would see end of file ... */
close(fildes[0]); /* Finished with pipe */
exit(EXIT_SUCCESS);
<br>
default: /* Parent - writes to pipe */
close(fildes[0]); /* Read end is unused */
write(fildes[1], "Hello world\n", 12); /* Write data on pipe */
close(fildes[1]); /* Child will see EOF */
exit(EXIT_SUCCESS);
}
</tt></pre><br></div><div class="gmail_extra"><div><div class="h5"><br><br><div class="gmail_quote">On Fri, Apr 5, 2013 at 3:33 PM, Geoffrey Myers <span dir="ltr"><<a href="mailto:lists@serioustechnology.com" target="_blank">lists@serioustechnology.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">So, shaking some cobwebs loose here. How do I replace the following:<br>
<br>
system("echo stuff | somebinary arg1 arg2");<br>
<br>
With a fork/exec ??<br>
<br>
(Digging out my old C books....)<br>
<br>
--<br>