/* * CHAT utilizando pipes con procesos emparentados * Excelente maestro es aquel que, enseņando poco, hace nacer * en el alumno un deseo grande de aprender. * Arturo Graf (1848-1913) Escritor y poeta italiano. */ #include #include #include #include #include #include #include int main(int argc, char **argv) { int pipe1[2]; // pipe1[0] -> lectura pipe1[1] -> escritura int pipe2[2]; // pipe2[0] -> lectura pipe2[1] -> escritura pipe(pipe1); pipe(pipe2); if ( fork() ) { // padre! P if ( fork() ) { // padre! P close(pipe1[0]); close(pipe1[1]); close(pipe2[0]); close(pipe2[1]); printf("P pid=%d\n",getpid()); while(wait(NULL) != -1); printf("P:fin!\n"); } else { // hijo! H2 if ( fork() ) { // hijo! H2 printf("--------------------------------H2 pid=%d\n",getpid()); close(pipe2[0]); close(pipe2[1]); close(pipe1[0]); char linea[255]; while(strncmp(linea,"chau",4) != 0) { printf("--------------------------------Ingrese mensaje\n"); gets(linea); printf("--------------------------------H2 [%d] envio [%s]\n",getpid(),linea); write(pipe1[1],linea,strlen(linea)); sleep(1) ; } close(pipe1[1]); printf("----------------------------------------H2 fin!\n"); } else { // nieto! N2 printf("--------------------------------N2 pid=%d\n",getpid()); close(pipe1[0]); close(pipe1[1]); close(pipe2[1]); char linea[255]; int n; while(strncmp(linea,"chau",4) != 0) { n = read(pipe2[0],linea,255); linea[n]='\0'; printf("--------------------------------N2 [%d] lei [%s]\n",getpid(),linea); } close(pipe2[0]); printf("N2 fin!\n"); } } } else { // hijo! H1 if ( fork() ) { // hijo! H1 printf("H1 pid=%d\n",getpid()); close(pipe2[0]); close(pipe1[1]); close(pipe1[0]); char linea[255]; while(strncmp(linea,"chau",4) != 0) { printf("ingrese mensaje \n"); gets(linea); printf("H1 [%d] envio [%s]\n",getpid(),linea); write(pipe2[1],linea,strlen(linea)); sleep(1) ; } close(pipe2[1]); printf("H1 fin!\n"); } else { // nieto! N1 printf("N1 pid=%d\n",getpid()); close(pipe2[0]); close(pipe2[1]); close(pipe1[1]); char linea[255]; int n; while(strncmp(linea,"chau",4) != 0) { n = read(pipe1[0],linea,255); linea[n]='\0'; printf("N1 [%d] lei [%s]\n",getpid(),linea); } close(pipe1[0]); printf("N1 fin!\n"); } } return 0; }