#include #include #include #include #include #include #include void syserr( const char *msg ) { perror(msg); exit(EXIT_FAILURE); } main() { int rfd, wfd; char buff[64096]; int nb; int ed; remove("duck"); if( mkfifo( "duck", 0666 ) == -1 ) { syserr( "mkfifo" ); } switch( fork() ) { case -1: syserr("fork" ); break; case 0: // child printf( "Child awakes\n" ); if( (rfd = open( "duck", O_RDWR )) == -1 ) { syserr( "open for reading" ); } printf("Child: open completes\n"); for( ; ; ) { if( (nb = read( rfd, buff, 200 )) == -1 ) { syserr( "read" ); } if( nb == 0 ) { printf("No more data\n"); printf("child terminates 0\n"); exit( 0 ); } buff[nb] = '\0'; printf("nb = %d Buff = |%s|\n", nb, buff); } break; default: // parent printf( "Parent awake\n" ); if( (wfd = open( "duck", O_RDWR )) == -1 ) { syserr( "open for writing" ); } printf("Parent opened pipe to write\n"); for( ed = 0; ed < 4; ed++ ) { sprintf( buff, "duckie %d", ed + 1 ); if(write( wfd, buff, strlen(buff)) != strlen(buff)) { syserr( "write" ); } } printf("parent terminates\n"); close(wfd); remove("duck"); sleep(1); } }