#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
// pipe setup for ps -aef | grep 0 | wc -l
int main()
{
static const int READ = 0;
static const int WRITE = 1;
int fd[2][2] = {{0}};
int pid = 0;
// last process first: wc -l
pipe(fd[0]);
if ((pid = fork()) == 0)
{
// setup "wc -l"
close(fd[0][WRITE]);
dup2(fd[0][READ], READ);
execlp("wc", "wc", "-l", NULL);
}
// no longer need this
close(fd[0][READ]);
// middle process: grep 0
pipe(fd[1]);
if ((pid = fork()) == 0)
{
// setup "grep 1"
close(fd[1][WRITE]);
dup2(fd[0][WRITE], WRITE);
dup2(fd[1][READ], READ);
execlp("grep", "grep", "0", NULL);
}
// no longer need this
close(fd[0][WRITE]);
close(fd[1][READ]);
// first process
if ((pid = fork()) == 0)
{
// setup ps -aef
dup2(fd[1][WRITE], WRITE);
execlp("ps", "ps", "-aef", NULL);
}
// no longer need his
close(fd[1][WRITE]);
pid = wait(NULL);
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHVuaXN0ZC5oPgoKLy8gcGlwZSBzZXR1cCBmb3IgcHMgLWFlZiB8IGdyZXAgMCB8IHdjIC1sCmludCBtYWluKCkKewogICAgc3RhdGljIGNvbnN0IGludCBSRUFEID0gMDsKICAgIHN0YXRpYyBjb25zdCBpbnQgV1JJVEUgPSAxOwogICAgaW50IGZkWzJdWzJdID0ge3swfX07CiAgICBpbnQgcGlkID0gMDsKICAgIAogICAgLy8gbGFzdCBwcm9jZXNzIGZpcnN0OiB3YyAtbAogICAgcGlwZShmZFswXSk7CiAgICBpZiAoKHBpZCA9IGZvcmsoKSkgPT0gMCkKICAgIHsKICAgICAgICAvLyBzZXR1cCAid2MgLWwiCiAgICAgICAgY2xvc2UoZmRbMF1bV1JJVEVdKTsKICAgICAgICBkdXAyKGZkWzBdW1JFQURdLCBSRUFEKTsKICAgICAgICBleGVjbHAoIndjIiwgIndjIiwgIi1sIiwgTlVMTCk7CiAgICB9CiAgICAvLyBubyBsb25nZXIgbmVlZCB0aGlzCiAgICBjbG9zZShmZFswXVtSRUFEXSk7CiAgICAKICAgIC8vIG1pZGRsZSBwcm9jZXNzOiBncmVwIDAKICAgIHBpcGUoZmRbMV0pOwogICAgaWYgKChwaWQgPSBmb3JrKCkpID09IDApCiAgICB7CiAgICAgICAgLy8gc2V0dXAgImdyZXAgMSIKICAgICAgICBjbG9zZShmZFsxXVtXUklURV0pOwogICAgICAgIGR1cDIoZmRbMF1bV1JJVEVdLCBXUklURSk7CiAgICAgICAgZHVwMihmZFsxXVtSRUFEXSwgUkVBRCk7CiAgICAgICAgZXhlY2xwKCJncmVwIiwgImdyZXAiLCAiMCIsIE5VTEwpOwogICAgfQogICAgLy8gbm8gbG9uZ2VyIG5lZWQgdGhpcwogICAgY2xvc2UoZmRbMF1bV1JJVEVdKTsKICAgIGNsb3NlKGZkWzFdW1JFQURdKTsKICAgIAogICAgLy8gZmlyc3QgcHJvY2VzcwogICAgaWYgKChwaWQgPSBmb3JrKCkpID09IDApCiAgICB7CiAgICAgICAgLy8gc2V0dXAgcHMgLWFlZgogICAgICAgIGR1cDIoZmRbMV1bV1JJVEVdLCBXUklURSk7CiAgICAgICAgZXhlY2xwKCJwcyIsICJwcyIsICItYWVmIiwgTlVMTCk7CiAgICB9CiAgICAvLyBubyBsb25nZXIgbmVlZCBoaXMKICAgIGNsb3NlKGZkWzFdW1dSSVRFXSk7CiAgICAKICAgIHBpZCA9IHdhaXQoTlVMTCk7CiAgICAKICAgIHJldHVybiAwOwp9