Hola gente,
En recomendacion de ElkaoD, abro otro hilo para otra duda acerca de las llamadas al sistema.
Necesito hacer un programa que mediante la llamada, ./program fsalida <fentrada.
1.- Haga un rev de fentrada y este resultado lo muestre por stdout
2.- Al resultado de ese rev se le haga un wc y lo muestre en el fsalida
El problema que tengo es que si pongo que muestre el resultado del rev por stdout, el resultado del wc, no es correcto, me da 0, sin embargo, si no pongo el resultado del rev, en el fsalida si que me da el resultado correcto.
Dejo aquí el código. Gracias
#include <sys/wait.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#define N 1024
int main(int argc, char * argv[]){
int fdin,fdout; //ficheros de entrada y salida
int nr,nr1,pid;
int p1[2]; //pipe1
int p2[2]; //pipe2
char buffer[N];
char buffer1[N];
if (argc!=2){ // Control de argumentos
perror("Número de argumentos incorrecto\n");
exit(EXIT_FAILURE);
}
pipe(p1); //Creamos el pipe1
pipe(p2); //Creamos el pipe2
//HIJO 1
pid=fork();
if (pid<0){ //Control de errores
perror("Error al crear el pid\n");
exit(EXIT_FAILURE);
}
if (pid==0){
close(p1[0]);
dup2(p1[1],1);
close(p1[1]);
close(p2[0]);
close(p2[1]);
execlp("rev","rev",NULL);
perror("Error al ejecutar el comando rev\n");
exit(EXIT_FAILURE);
}
//HIJO 2
pid=fork();
if (pid<0){ //Control de errores
perror("Error al crear el pid\n");
exit(EXIT_FAILURE);
}
if (pid==0){
close(p1[1]);
dup2(p1[0],0);
close(p1[0]);
close(p2[0]);
dup2(p2[1],1);
close(p2[1]);
execlp("wc","wc","-w",NULL);
perror("Error al ejecutar el comando wc\n"); //Control de errores
exit(EXIT_FAILURE);
}
close(p1[1]);
close(p2[1]);
fdout=creat(argv[1],S_IRWXU); //Creamos el fichero de salida y vamos leyendo de la segunda tubería para escribirlo en el fichero
for(;;){
nr=read(p1[0],buffer,N);
if (nr<=0){
break;
}
write(1,buffer,nr);
}
for(;;){
nr=read(p2[0],buffer,N);
if(nr<=0){
break;
}
write(fdout,buffer,nr);
}
close(p1[0]);
close(p2[0]);
close(fdout);
wait(NULL);
wait(NULL);
return 0;
}