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*/