Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <unistd.h>
- #include <stdlib.h>
- #include <stdio.h>
- #include <string.h>
- #include <sys/types.h>
- #include <signal.h>
- /**
- En la siguiente práctica se nos pide desarrollar un programa en lenguaje C que realice lo siguiente:
- El proceso padre generará dos procesos hijos. El padre, leerá datos de stdin (teclado) y los enviará
- a los hijos. El hijo#1 sacará por pantalla el texto leído del padre, a la salida estándar. El hijo #2 sacará
- lo leído a un fichero. Cuando el padre tenga como entrada “exit”, mandará señales de terminación a
- los hijos y se cerrará.
- */
- pid_t pidAmigoChivato,pidAmigoResponsable;
- FILE *out;
- int tuberia[2];
- int tuberia2[2];
- /*Proceso del Amigo Chivato*/
- void procesoAmigoChivato(){
- char buffer[255];
- close(tuberia[1]);
- close(0);
- dup(tuberia[0]);
- /* Escucha el secreto que le cuenta su amigo */
- fgets(buffer, 254, stdin);
- /* Como es un chivato lo cuenta mostrándolo por pantalla */
- printf("\n[AmigoChivato - %d]:> El secreto es: %s", getpid(),buffer);
- exit(0);
- }
- /*Proceso del Amigo Responsable*/
- void procesoAmigoResponsable(){
- char buffer[255];
- close(tuberia2[1]);
- close(0);
- dup(tuberia2[0]);
- /* Escucha el secreto que le cuenta su amigo */
- fgets(buffer, 254, stdin);
- /* Llama chivato al amigo */
- printf("[%d] ¡Eres un chivato!..", pidAmigoChivato);
- /* Como es un amigo responsable, en lugar de comunicarselo a todos se lo guarda para él*/
- out = fopen( "/home/monje/CajaSecretos.txt", "w" );
- if( out != NULL ) fprintf( out, "Secreto: %s", buffer );
- fclose(out);
- exit(0);
- }
- void procesoAmigo(){
- char buffer[255];
- close(tuberia[0]);
- close(tuberia2[0]);
- close(2);
- dup2(tuberia[1],2);
- dup2(tuberia2[1],2);
- fgets(buffer, 254, stdin);
- while(strlen(buffer) != 0 && buffer[0] != '\n'){
- fprintf(stderr, "%s\n", buffer);
- fgets(buffer, 254, stdin);
- }
- exit(0);
- }
- int main(){
- pipe(tuberia);
- pipe(tuberia2);
- //Hijo1
- switch (pidAmigoChivato = fork()){
- case -1: // algo va mal
- perror ("fork");
- exit (0);
- case 0: // soy el hijo1!
- procesoAmigoChivato();
- exit (0);
- default: // soy el padre!
- break;
- }
- //Hijo2
- switch (pidAmigoResponsable = fork()){
- case -1: // algo va mal
- perror ("fork");
- exit (0);
- case 0: // soy el hijo2!
- procesoAmigoResponsable();
- exit (0);
- default: // soy el padre!
- break;
- }
- printf("[Amigo - %d] cuenta secreto a [AmigoChivato - %d] y [AmigoResponsable - %d] \n", getpid(), pidAmigoChivato, pidAmigoResponsable);
- printf("¡Amigo cuenta tu secreto!:> ");
- procesoAmigo();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement