I’ve been messing around in C trying to figure out how to do this. Let’s say I have my main program, the parent process. The parent creates three child processes, each of which will eventually run programs (but that’s not important right now). What I’d like to do is make it so that the first child’s stdout will be received by the second child’s stdin. The second child’s stdout will then be received by the third child’s stdin.
The parent process’s stdin/stdout aren’t messed with at all.
So far, what I’ve got is
pipe(procpipe);
parentPid = getpid();
for(i = 0; i < 3; i++)
{
if(getpid() == parentPid)
{
child[i] = fork();
if(child[i] == 0)
{
mynumber = i+1;
}
}
}
But from there I’m kind of stuck as to how to use dup2 to properly assign my pipes, and in which section of my code to insert it. There are lots of examples on Google and this website of how to pipe from a parent to a child, but I’m yet to see one that will tell me exactly how to connect a child’s stdout to another child’s stdin.
Edit:
Forgot to mention: assume all my variables are properly initialised. The int ‘mynumber’ is so a child process knows upon creation which number it is, so I can give it instructions via
if(mynumber == whatever)
So you have a loop that creates several child processes. Each of these child processes will be using two pipes: read from previous and write to the next. To set up a pipe for the reading end you need to close the write end of the pipe, and
dup2the read end into the stdin. Similar for the pipe where the process will be writing.When you fork each children you need to attach the pipes to it.
With this in hand you can now write a loop that continuously forks, attaches the pipes, and then reuses the output pipe as the input pipe for the next one. Of course, once both ends of a pipe have been connected to child processes, the parent should not leave it open for itself.
The closing bits are very important! When you fork with an open pipe, there will be four open file descriptors: two on the parent process, and two others on the child process. You have to close all of those you won’t be using. That’s why the code above always closes the irrelevant ends of the pipes in the child processes, and both ends on the parent.
Also note that I am giving special treatment to the first and the last processes, because I don’t know where the input for the chain will come from, and where the output will go to.