|  | #include <sched.h> | 
|  | #include <stdlib.h> | 
|  | #include <stdio.h> | 
|  | #include <unistd.h> | 
|  | #include <parlib/vcore.h> | 
|  |  | 
|  | void child_handler(int readfd, int writefd) | 
|  | { | 
|  | char c; | 
|  |  | 
|  | read(readfd, &c, 1); | 
|  | close(readfd); | 
|  | printf("Child read from pipe0\n"); | 
|  | printf("Child writing to pipe1\n"); | 
|  | write(writefd, "", 1); | 
|  | close(writefd); | 
|  | exit(0); | 
|  | } | 
|  |  | 
|  | void parent_handler(int readfd, int writefd) | 
|  | { | 
|  | /* Force the child to run first. */ | 
|  | for (int i = 0; i < 10; i++) | 
|  | sched_yield(); | 
|  |  | 
|  | char c; | 
|  |  | 
|  | printf("Parent writing to pipe0\n"); | 
|  | write(writefd, "", 1); | 
|  | close(writefd); | 
|  | read(readfd, &c, 1); | 
|  | close(readfd); | 
|  | printf("Parent read from pipe1\n"); | 
|  | exit(0); | 
|  | } | 
|  |  | 
|  | int main(int argc, char **argv) | 
|  | { | 
|  | int pipe0[2]; | 
|  | int pipe1[2]; | 
|  |  | 
|  | pipe(pipe0); | 
|  | pipe(pipe1); | 
|  | pid_t child = fork(); | 
|  | if (child == 0) { | 
|  | close(pipe0[1]); | 
|  | close(pipe1[0]); | 
|  | child_handler(pipe0[0], pipe1[1]); | 
|  | } else { | 
|  | close(pipe0[0]); | 
|  | close(pipe1[1]); | 
|  | parent_handler(pipe1[0], pipe0[1]); | 
|  | } | 
|  | return 0; | 
|  | } |