[ Foro de C ]

Invertir los elementos de un fichero

10-Jun-2019 20:28
Invitado (Ana.T)
0 Respuestas

Buenas tardes,

Me da un error al ejecutar mi código. Mi código debe hacer lo siguiente: recibe dos ficheros (fichero1, fichero2) y la salida debe ser un fichero3 con el contenido de los ficheros 1 y 2 invertido. Para ello debo usar la función reverse, pero no consigo que me funcione.
También el ejercicio es usando tuberías (pipes).

Adjunto mi código, por si alguien puede ayudarme.

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

int main (int argc, char *argv[]){

int pid, pipe1[2]/*Del paste al sort*/, pipe2[2] /*Del sort al padre*/, fd, bytes_leidos;
int status_pipe, status_close, status_exec, status_sort, status_reverse;
char buffer[1024];

if (argc == 4) {

status_pipe = pipe(pipe1); //Creo la tubería pipe1
if (status_pipe == -1){
perror("Error al crear el primer pipe");
}

status_pipe = pipe(pipe2); //Creo la tuberia pipe2
if (status_pipe == -1){
perror("Error al crear el primer pipe");
}

pid = fork(); // Creo el primer hijo

if (pid == -1){
perror("Error al crear el primer hijo");
}else if(pid == 0){
pid = fork(); // Creo el segundo hijo
if (pid == -1){
perror("Error al crear el segundo hijo");
}else if (pid == 0){

//Hijo paste
status_close = close(pipe1[0]); //Cierro el pipe1 lectura
if (status_close == -1){
perror("Error al cerrar pipe1[0] en el paste");
}
status_close = close(pipe2[0]); //Cierro el pipe2 lectura
if (status_close == -1){
perror("Error al cerrar pipe2[0] en el paste");
}
status_close = close(pipe2[1]); //Cierro el pipe2 escritura
if (status_close == -1){
perror("Error al cerrar pipe2[1] en el paste");
}

dup2(pipe1[1], 1); //Cierras pipe1[1] para que no vaya a la salida estandar y lo rediriges a la tuberia
status_close = close(pipe1[1]); //Cierro el pipe1 escritura
if (status_close == -1){
perror("Error al cerrar pipe1[1] en el paste");
}
status_exec = execlp("paste","paste",argv[1],argv[2], NULL); //Realizamos el paste. Los dos primeros argumentos
if (status_exec == -1){
perror("Error al hacer exec");
}

}else if (pid > 0){

//Hijo sort
status_close = close(pipe1[1]); //Cierro el pipe1 escritura
if (status_close == -1){
perror("Error al cerrar pipe1[1] en el sort");
}
status_close = close(pipe2[0]); //Cierro el pipe2 lectura
if (status_close == -1){
perror("Error al cerrar pipe2[0] en el sort");
}

dup2(pipe1[0], 0); //Cierras la entrada estandar para que lea de la tubería
status_close = close(pipe1[0]); //Cierro el pipe1 lectura
if (status_close == -1){
perror("Error al cerrar pipe1[0] en el sort");
}

dup2(pipe2[1], 1); //Cierras el 1 porque es la salida estandar y lo rediriges a la tubería
status_close = close(pipe2[1]); //Cierro el pipe2 escritura
if (status_close == -1){
perror("Error al cerrar pipe2[1] en el sort");
}

status_reverse = execlp("reverse", "reverse", NULL);
if (status_reverse == -1){
perror("Error al hacer reverse");
}
//status_sort = execlp("sort","sort", NULL);
//if (status_sort == -1){
//perror("Error al hacer sort");
//}

}
}else if(pid > 0){

//Padre
status_close = close(pipe1[0]);
if (status_close == -1){
perror("Error al cerrar pipe1[0] en el padre");
}

status_close = close(pipe1[1]);
if (status_close == -1){
perror("Error al cerrar pipe1[1] en el padre");
}

fd = open(argv[3], O_RDWR|O_CREAT|O_TRUNC, 0700);
if (fd == -1){
perror("Error al abrir el archivo");
}
bytes_leidos = read(pipe2[0],buffer, sizeof(buffer));
while (bytes_leidos > 0) {
write(fd, buffer, bytes_leidos);
bytes_leidos = read(pipe2[0],buffer, sizeof(buffer));
}

status_close = close(pipe2[1]);

if (status_close == -1){
perror("Error al cerrar pipe2[1] en el padre");
}
}
}else{
perror("Argumentos invalidos");
}
}


Muchas gracias




Si ya eres usuario del sistema, puedes contestar desde tu cuenta y así ganar prestigio.

Si sólo eres un visitante, puedes optar por...