#include <unistd.h>
int main() {
// create two pipes for communication
int back[2];
int forth[2];
pipe(back);
pipe(forth);
// make a copy of this process
if(fork() == 0) {
// in that copy...
// set this process's stdin to be the read end of back
dup2(back[0], 0);
// and stdout to be the write end of forth
dup2(forth[1], 1);
// cleanup the now unnecessary pipe ends
close(back[0]); close(back[1]);
close(forth[0]); close(forth[1]);
// replace this process with the cat program
// it simply copies input from stdin to stdout
execlp("cat", "cat", 0); // never returns
}
// ... and in the original process
// write meow into the back pipe
write(back[1], "meow", 5);
//
// set this process's stdin to be the read end of forth
dup2(forth[0], 0);
// and stdout to be the write end of back
dup2(back[1], 1);
// cleanup the now unnecessary pipe ends
close(back[0]); close(back[1]);
close(forth[0]); close(forth[1]);
// replace this one with cat too
execlp("cat", "cat", 0);
// now each of the cat programs reads from the other's stdout
// and writes intp the other's stdin
// and we dropped a "meow" in the pipes
// do the math...
}
I2luY2x1ZGUgPHVuaXN0ZC5oPgoKaW50IG1haW4oKSB7CiAgICAvLyBjcmVhdGUgdHdvIHBpcGVzIGZvciBjb21tdW5pY2F0aW9uCiAgICBpbnQgYmFja1syXTsKICAgIGludCBmb3J0aFsyXTsKICAgIHBpcGUoYmFjayk7CiAgICBwaXBlKGZvcnRoKTsKCiAgICAvLyBtYWtlIGEgY29weSBvZiB0aGlzIHByb2Nlc3MKICAgIGlmKGZvcmsoKSA9PSAwKSB7CiAgICAgICAgLy8gaW4gdGhhdCBjb3B5Li4uCiAgICAgICAgLy8gc2V0IHRoaXMgcHJvY2VzcydzIHN0ZGluIHRvIGJlIHRoZSByZWFkIGVuZCBvZiBiYWNrCiAgICAgICAgZHVwMihiYWNrWzBdLCAwKTsKICAgICAgICAvLyBhbmQgc3Rkb3V0IHRvIGJlIHRoZSB3cml0ZSBlbmQgb2YgZm9ydGgKICAgICAgICBkdXAyKGZvcnRoWzFdLCAxKTsKICAgICAgICAvLyBjbGVhbnVwIHRoZSBub3cgdW5uZWNlc3NhcnkgcGlwZSBlbmRzCiAgICAgICAgY2xvc2UoYmFja1swXSk7IGNsb3NlKGJhY2tbMV0pOwogICAgICAgIGNsb3NlKGZvcnRoWzBdKTsgY2xvc2UoZm9ydGhbMV0pOwogICAgICAgIC8vIHJlcGxhY2UgdGhpcyBwcm9jZXNzIHdpdGggdGhlIGNhdCBwcm9ncmFtCiAgICAgICAgLy8gaXQgc2ltcGx5IGNvcGllcyBpbnB1dCBmcm9tIHN0ZGluIHRvIHN0ZG91dAogICAgICAgIGV4ZWNscCgiY2F0IiwgImNhdCIsIDApOyAvLyBuZXZlciByZXR1cm5zCiAgICB9CiAgICAvLyAuLi4gYW5kIGluIHRoZSBvcmlnaW5hbCBwcm9jZXNzCiAgICAvLyB3cml0ZSBtZW93IGludG8gdGhlIGJhY2sgcGlwZQogICAgd3JpdGUoYmFja1sxXSwgIm1lb3ciLCA1KTsKICAgIC8vIAogICAgLy8gc2V0IHRoaXMgcHJvY2VzcydzIHN0ZGluIHRvIGJlIHRoZSByZWFkIGVuZCBvZiBmb3J0aAogICAgZHVwMihmb3J0aFswXSwgMCk7CiAgICAvLyBhbmQgc3Rkb3V0IHRvIGJlIHRoZSB3cml0ZSBlbmQgb2YgYmFjawogICAgZHVwMihiYWNrWzFdLCAxKTsKICAgIC8vIGNsZWFudXAgdGhlIG5vdyB1bm5lY2Vzc2FyeSBwaXBlIGVuZHMKICAgIGNsb3NlKGJhY2tbMF0pOyBjbG9zZShiYWNrWzFdKTsKICAgIGNsb3NlKGZvcnRoWzBdKTsgY2xvc2UoZm9ydGhbMV0pOwogICAgLy8gcmVwbGFjZSB0aGlzIG9uZSB3aXRoIGNhdCB0b28KICAgIGV4ZWNscCgiY2F0IiwgImNhdCIsIDApOwoKICAgIC8vIG5vdyBlYWNoIG9mIHRoZSBjYXQgcHJvZ3JhbXMgcmVhZHMgZnJvbSB0aGUgb3RoZXIncyBzdGRvdXQKICAgIC8vIGFuZCB3cml0ZXMgaW50cCB0aGUgb3RoZXIncyBzdGRpbgogICAgLy8gYW5kIHdlIGRyb3BwZWQgYSAibWVvdyIgaW4gdGhlIHBpcGVzCiAgICAvLyBkbyB0aGUgbWF0aC4uLgp9Cg==