<div dir="ltr"><span style="font-family:arial,sans-serif;font-size:13px">set up a pipe, fork(), dup2(pipe_output, STDIN); exec(), (from parent process) push &quot;stuff&quot; into pipe should work for that.</span><br><div>
<span style="font-family:arial,sans-serif;font-size:13px"><br></span></div><div style><span style="font-family:arial,sans-serif;font-size:13px">Something like:</span></div><div style><span style="font-family:arial,sans-serif;font-size:13px">(Please add error checking...)</span></div>
<div style><span style="font-family:arial,sans-serif;font-size:13px"><br></span></div><div style><span style="font-family:arial,sans-serif;font-size:13px">pid_t child;</span></div><div style><span style="font-family:arial,sans-serif;font-size:13px">int pipefd[2];</span></div>
<div style><span style="font-family:arial,sans-serif;font-size:13px">char stuff[] = &quot;stuff&quot;;</span></div><div style><span style="font-family:arial,sans-serif;font-size:13px"><br></span></div><div style><span style="font-family:arial,sans-serif;font-size:13px">pipe(pipefd);</span></div>
<div style><span style="font-family:arial,sans-serif;font-size:13px">if((child = fork()) == 0) {</span></div><div style><font face="arial, sans-serif">  // Child</font></div><div style><font face="arial, sans-serif">  dup2(pipefd[0], STDIN_FILENO);</font></div>
<div style><font face="arial, sans-serif">  execl(&quot;/bin/foo&quot;, &quot;/bin/foo&quot;, &quot;--some-arg&quot;);</font></div><div style><font face="arial, sans-serif">}</font></div><div style><font face="arial, sans-serif">write(pipefd[1], stuff, strlen(stuff));</font></div>
<div style><font face="arial, sans-serif">waitpid(child, ...);</font></div><div style><font face="arial, sans-serif"><br></font></div><div style><font face="arial, sans-serif">(Haven&#39;t tested it, but this should work...)</font></div>
<div style><span style="font-family:arial,sans-serif;font-size:13px"><br></span></div><div style><span style="font-family:arial,sans-serif;font-size:13px"><br></span></div></div><div class="gmail_extra"><br><br><div class="gmail_quote">
On Sun, Apr 7, 2013 at 4:03 PM, Geoffrey Myers <span dir="ltr">&lt;<a href="mailto:lists@serioustechnology.com" target="_blank">lists@serioustechnology.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div style="word-wrap:break-word">Yeah, I&#39;ve got the standard parent writes to the child process down.  That&#39;s not the issue.  I&#39;ve got to write to one process via a pipe.  That process is not a process I&#39;m writing, but an existing program.  Again, check the example: <div class="im">
<div><br></div><div>system(&quot;echo stuff | somebinary arg1 arg2&quot;);</div><div><br></div></div><div>The part I&#39;m wrestling with is the:</div><div><br></div><div>echo stuff | somebinary<br><div><br><div><br></div>
<div><div><div class="h5"><br><div><div>On Apr 5, 2013, at 7:56 PM, Ed Cashin wrote:</div><br><blockquote type="cite"><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&#39;t shown.<br><br><pre><tt>#include &lt;stdlib.h&gt;
#include &lt;unistd.h&gt;
...
<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], &quot;Hello world\n&quot;, 12);  /* Write data on pipe */
    close(fildes[1]);                       /* Child will see EOF */
    exit(EXIT_SUCCESS);
}
</tt></pre><br></div><div class="gmail_extra"><br><br><div class="gmail_quote">On Fri, Apr 5, 2013 at 3:33 PM, Geoffrey Myers <span dir="ltr">&lt;<a href="mailto:lists@serioustechnology.com" target="_blank">lists@serioustechnology.com</a>&gt;</span> wrote:<br>

<blockquote class="gmail_quote" style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">So, shaking some cobwebs loose here. How do I replace the following:<br>

<br>
system(&quot;echo stuff | somebinary arg1 arg2&quot;);<br>
<br>
With a fork/exec ??<br>
<br>
(Digging out my old C books....)<br>
<br>
--<br>