… is user for unidirectional inter process communication on a single machine.
In the following example a pipe gets created for a communication from the child to the parent.
Source code
#include <sys/types.h> #include <unistd.h> #include <cstring> #include <iostream> int main() { int pipefd[2]; // pipefd[0] ... read, pipefd[1] ... write pipe(pipefd); pid_t pid = fork(); if (pid == -1) { /* Couldn't fork */ std::cout << "Couldn't fork" << std::endl; } else if (pid == 0) { /* Child process */ close(pipefd[0]); // close read end dup2(pipefd[1], 1); // redirect write end to stdout close(pipefd[1]); // close origin write end execlp("./child.out", "child.out", NULL ); // returns only in error case std::cout << "Exec failed with: " << errno << std::endl; } else { /* Parent process */ close(pipefd[1]); // close write end char buf[1024]; while (read(pipefd[0], buf, sizeof(buf)) > 0) { std::cout << "My child said: " << buf << std::endl; memset(buf, 0, sizeof(buf)); } close(pipefd[0]); // close unecessary read end } return 0; }
#include <unistd.h> #include <iostream> int main() { std::cout << "Hold" << std::endl; sleep(1); std::cout << "my" << std::endl; sleep(1); std::cout << "beer" << std::endl; return 0; }
Output
$ ./main.out My child said: Hold My child said: my My child said: beer
File descriptors
Parent | Child --------------------------------------- 0 stdin | 0 stdin 1 stdout | 1 pipefd[1] 3 stderr | 2 pipefd[1] ... | ... X pipefd[0] | ... | ---------------------------------------