#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <string.h>
#define BUFFER_SIZE 25
#define READ 0
#define WRITE 1
int main(void)
{
pid_t pid;
//open two pipes, one for each direction
int mypipefd[2];
int mypipefd2[2];
/* create the pipe */
if (pipe(mypipefd) == -1 || pipe(mypipefd2) == -1) {
return 1;
}
/* now fork a child process */
pid = fork();
if (pid < 0) {
return 1;
}
if (pid > 0) { /* parent process */
int writeValue=10;
int readValue=0;
close(mypipefd[READ]); //close read end, write and then close write end
write(mypipefd[WRITE],&writeValue,sizeof(writeValue)); //write to pipe one
printf("Parent: writes value : %d\n", writeValue
); close(mypipefd[WRITE]);
close(mypipefd2[WRITE]); //close write end, read, and then close read end
read(mypipefd2[READ],&readValue,sizeof(readValue));
printf("Parent: reads value : %d\n", readValue
); close(mypipefd2[READ]);
}
else { /* child process */
int writeValue=20;
int readValue=0;
close(mypipefd[WRITE]); //close write end, read, and then close read end
read(mypipefd[READ],&readValue,sizeof(readValue));
printf("child: read value : %d\n", readValue
); writeValue+=readValue;
close(mypipefd[READ]);
close(mypipefd2[READ]); //close read end, write and then close write end
write(mypipefd2[WRITE],&writeValue,sizeof(writeValue));
printf("child: writeValue value : %d\n", writeValue
); close(mypipefd2[WRITE]);
}
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDx1bmlzdGQuaD4KI2luY2x1ZGUgPHN5cy90eXBlcy5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CgojZGVmaW5lIEJVRkZFUl9TSVpFIDI1CiNkZWZpbmUgUkVBRCAgMAojZGVmaW5lIFdSSVRFIDEKCmludCBtYWluKHZvaWQpCnsKICBwaWRfdCBwaWQ7CiAgLy9vcGVuIHR3byBwaXBlcywgb25lIGZvciBlYWNoIGRpcmVjdGlvbgogIGludCBteXBpcGVmZFsyXTsKICBpbnQgbXlwaXBlZmQyWzJdOwoKICAvKiBjcmVhdGUgdGhlIHBpcGUgKi8KICBpZiAocGlwZShteXBpcGVmZCkgPT0gLTEgfHwgcGlwZShteXBpcGVmZDIpID09IC0xKSB7CiAgICBmcHJpbnRmKHN0ZGVyciwiUGlwZSBmYWlsZWQiKTsKICAgIHJldHVybiAxOwogIH0KCiAgLyogbm93IGZvcmsgYSBjaGlsZCBwcm9jZXNzICovCiAgcGlkID0gZm9yaygpOwoKICBpZiAocGlkIDwgMCkgewogICAgZnByaW50ZihzdGRlcnIsICJGb3JrIGZhaWxlZCIpOwogICAgcmV0dXJuIDE7CiAgfQoKICBpZiAocGlkID4gMCkgeyAgLyogcGFyZW50IHByb2Nlc3MgKi8gIAogICAgaW50IHdyaXRlVmFsdWU9MTA7CiAgICBpbnQgcmVhZFZhbHVlPTA7CiAgICBjbG9zZShteXBpcGVmZFtSRUFEXSk7ICAgICAgLy9jbG9zZSByZWFkIGVuZCwgd3JpdGUgYW5kIHRoZW4gY2xvc2Ugd3JpdGUgZW5kCiAgICB3cml0ZShteXBpcGVmZFtXUklURV0sJndyaXRlVmFsdWUsc2l6ZW9mKHdyaXRlVmFsdWUpKTsgICAgLy93cml0ZSB0byBwaXBlIG9uZQogICAgcHJpbnRmKCJQYXJlbnQ6IHdyaXRlcyB2YWx1ZSA6ICVkXG4iLCB3cml0ZVZhbHVlKTsKICAgIGNsb3NlKG15cGlwZWZkW1dSSVRFXSk7CiAgICBjbG9zZShteXBpcGVmZDJbV1JJVEVdKTsgICAgICAgIC8vY2xvc2Ugd3JpdGUgZW5kLCByZWFkLCBhbmQgdGhlbiBjbG9zZSByZWFkIGVuZAogICAgcmVhZChteXBpcGVmZDJbUkVBRF0sJnJlYWRWYWx1ZSxzaXplb2YocmVhZFZhbHVlKSk7CiAgICBwcmludGYoIlBhcmVudDogcmVhZHMgdmFsdWUgOiAlZFxuIiwgcmVhZFZhbHVlKTsKICAgIGNsb3NlKG15cGlwZWZkMltSRUFEXSk7CiAgfQogIGVsc2UgeyAvKiBjaGlsZCBwcm9jZXNzICovCiAgICBpbnQgd3JpdGVWYWx1ZT0yMDsKICAgIGludCByZWFkVmFsdWU9MDsKICAgIGNsb3NlKG15cGlwZWZkW1dSSVRFXSk7ICAgLy9jbG9zZSB3cml0ZSBlbmQsIHJlYWQsIGFuZCB0aGVuIGNsb3NlIHJlYWQgZW5kCiAgICByZWFkKG15cGlwZWZkW1JFQURdLCZyZWFkVmFsdWUsc2l6ZW9mKHJlYWRWYWx1ZSkpOwogICAgcHJpbnRmKCJjaGlsZDogcmVhZCB2YWx1ZSA6ICVkXG4iLCByZWFkVmFsdWUpOwogICAgd3JpdGVWYWx1ZSs9cmVhZFZhbHVlOwogICAgY2xvc2UobXlwaXBlZmRbUkVBRF0pOwogICAgY2xvc2UobXlwaXBlZmQyW1JFQURdKTsgICAgICAgLy9jbG9zZSByZWFkIGVuZCwgd3JpdGUgYW5kIHRoZW4gY2xvc2Ugd3JpdGUgZW5kCiAgICB3cml0ZShteXBpcGVmZDJbV1JJVEVdLCZ3cml0ZVZhbHVlLHNpemVvZih3cml0ZVZhbHVlKSk7CiAgICBwcmludGYoImNoaWxkOiB3cml0ZVZhbHVlIHZhbHVlIDogJWRcbiIsIHdyaXRlVmFsdWUpOwogICAgY2xvc2UobXlwaXBlZmQyW1dSSVRFXSk7CgogIH0KCiAgcmV0dXJuIDA7Cn0K