• Jueves 14 de Noviembre de 2024, 23:05

Autor Tema:  Ayuda Con Tuberías Anónimas  (Leído 942 veces)

akasha_queen

  • Nuevo Miembro
  • *
  • Mensajes: 1
    • Ver Perfil
Ayuda Con Tuberías Anónimas
« en: Jueves 25 de Agosto de 2005, 21:55 »
0
Soy estudiante de informática y he hecho este programilla para trabajar el uso de las tuberías anónimas y al ejecutarlo se me queda colgado. Os agradecería que me pudierais echar una manillo, ya que no se a quien acudir, porque mi profe está de vacaciones y ahora en septiembre tengo examen de sistemas operativos y en teoría debería saber estas cosillas. Gracias


/******************************************************************************
        tub_hijo_padre.c : El padre lee desde un archivo y lo envia mediante tuberias
 anonimas, el hijo lo modifica concatenadole una palabre y lo reenvia al padre que
 lo guarda en otro archivo
******************************************************************************/

#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <sys/stat.h>
#include <string.h>

#define BUF_SIZE 256

int main(int argc, char *argv[]){
ssize_t bytes_leidos, bytes_escritos;
int desc_fich1, desc_fich2;
char buf[BUF_SIZE];
int tub[2], tub2[2];
pid_t phijo;

        if (argc != 3){
            printf("Usage: tub_hijo_padre fich1 fich2 \n");
        }

        if (pipe(tub) == -1){
             perror("Error al crear la tuberia \n");
             exit(-1);
        }
        if (pipe(tub2) == -1){
            perror("Error al crear al tuberia2 \n");
            exit(-1);
        }
       else{
            phijo = fork();
            if (phijo == -1){
                perror("Error al crear el hijo \n");
                exit(-1);
            }
            else if (phijo == 0){/*hijo*/
                close (tub[1]);
                close (tub2[0]);

                while ((bytes_leidos = read(tub[0], buf, BUF_SIZE)) > 0){
                   strcat(buf, " pepe");
                   if ((bytes_escritos = write (tub2[1], buf, sizeof(buf))) == -1){
                        perror("Error en el write del padre \n");
                        exit(-1);
                   }

                }

                close (tub[0]);
                close (tub2[1]);

            }/*else if*/
            else{/*padre*/
                close(tub[0]);
                close(tub2[1]);

                desc_fich1 = open (argv[1], O_RDONLY);
                if (desc_fich1 == -1){
                    perror(argv[1]);
                    exit(-1);
                }

                while ((bytes_leidos = read (desc_fich1, buf, BUF_SIZE)) > 0){
                     bytes_escritos = write (tub[1], buf, bytes_leidos);
                     if(bytes_leidos != bytes_escritos){
                        perror("Error al copiar datos en la tuberia1 \n");
                        exit(-1);
                     }
                close (desc_fich1);
                close (tub[1]);


                /*copio los datos recibidos del hijo en un fichero*/
                desc_fich2 = open (argv[2], O_CREAT| O_WRONLY| O_TRUNC, 0666);
                if (desc_fich2 == -1){
                    perror(argv[2]);
                    exit(-1);
                }
                while ((bytes_leidos = read (tub2[0],buf, BUF_SIZE)) > 0){
                     bytes_escritos = write (desc_fich2, buf, bytes_leidos);
                     if (bytes_leidos != bytes_escritos){
                        perror("Error al escribir datos en fichero destino \n");
                        exit(-1);
                     }

                }
                close (desc_fich2);
                close (tub2[0]);
            }/*else padre*/
        }/*else pipe*/

}/*main*/