No sé donde está el fallo ya que a la hora de ejecutar (./padre /home/usuario/*) me devuelve solamente barras, cuando debe devolverme los archivos y directorios que tengo en la ruta. Por ejemplo; en mi ruta /home/usuario/* tengo 17 archivos, cuando ejecuto mi código me devuelve 17 barras (/////////////////) y lo que necesito que me devuelva es el nombre de cada archivo o directorio de esa ruta.
Por favor si alguien me puede ayudar, le estaría sumamente agradecida!!!.
A continuacion paso el código del proceso padre y del proceso hijo (ambos códigos son necesarios), el modo de ejecucion debe ser de la siguiente manera:
gcc hijo.c -o hijo
gcc padre.c -o padre
./padre /home/usuario/*
CODIGO DE PADRE
Código:
/*fd[0] = se encarga de la lectura
fd[1] = se encarga de la escritura
fd[2] = hace ambas cosas, lectura/escritura*/
#define _POSIX_SOURCE
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <signal.h>
#include <wait.h>
#include <sys/stat.h>
#include <fcntl.h>
#define NUM_HIJOS 10//El numero de hijos debe ser tantos como numero de parametros haya
#define NOMBREHIJO "./hijo"
#define MAXBUFFER 256 //Tamaño del buffer lectura/escritura
void FinalizarProcesos();
void Manejador(int num);
pid_t pids[NUM_HIJOS];
int longitud_pid=0;//logitud del pid
int main(int argc, char *argv[]){
int fd[2];//Descriptores de la tuberia de comunicacion
int i, j; //Para los bucles
int pid; //PID de un proceso hijo
int status; //terminacion proceso hijo
char buffer[MAXBUFFER];//buffer de lectura/escritura
int num_caracteres;
/*Tratamiento de la linea de ordenes*/
if(argc < 2){// < 2
fprintf(stderr, "Error en el numero de argumentos\n");
exit(EXIT_FAILURE);
}
/*Tratamiento de la señal*/
if(signal(SIGINT, Manejador)== SIG_ERR){
fprintf(stderr, "Error en la manipulacion de la señal\n");
exit(EXIT_FAILURE);
}
/*Creacion de la tubería de comunicacion*/
if(pipe(fd) != 0){
fprintf(stderr, "Error en la creacion de la tuberia\n");
return EXIT_FAILURE;
}
//CREACION DE LOS PROCESOS HIJOS
for(i=1; i<argc; i++){//NUM_HIJOS
switch(pids[i-1]=fork()){ //Se guarda el pid en la tabla de procesos y con pids[i-1]se salta el ./padre
case -1:
fprintf(stderr, "Error en la creacion del proceso hijo\n");
FinalizarProcesos();
break;
case 0: //Ejecucuion por el proceso hijo
/*Redireccion de la entrada estandar al archivo*/
if ((fd[0] = open(argv[1], O_RDONLY)) == -1){
fprintf(stderr, "Error en la apertura del archivo de datos\n");
return EXIT_FAILURE;
}
close(1);
if(dup(fd[1]) != 1){// Asignacion de salida estandar
fprintf(stderr, "Error en la duplicacion del descriptor\n");
return EXIT_FAILURE;
}
if(execl(NOMBREHIJO, NOMBREHIJO, argv[i], NULL) == -1){ //argv[1]
fprintf(stderr, "Error en la ejecucion del proceso hijo\n");
perror("execl");
exit(EXIT_FAILURE);
}
break;
default: /*Ejecucion por el proceso padre*/
//close(fd[1]);// debe de ir fuera del for
break;
}
longitud_pid++; //Para tener un control de cuantas cosas hay dentro del pids, por ejemplo hola (longitud=1) mundo (longitud=2)
}
close(fd[1]);
/*Espera a la finalizacion de los procesos hijos*/
for(i=1; i<NUM_HIJOS; i++){
pid=wait(NULL);
//leer un caracter de entrada de la tuberia fd[0] (READ)
if ((num_caracteres = read(fd[0], buffer, MAXBUFFER)) > 0){
printf("%.*s", num_caracteres, buffer);//leerá la tuberia y la escribirá en la salida estandar
}
}
printf("[Proceso padre] finaliza\n");
return EXIT_SUCCESS;
}
/*FinalizarProcesos: Termina todos los procesos hijos vivos*/
void FinalizarProcesos(void){
int i;
for(i=0; i<longitud_pid; i++){ //Logitud_pid es porque los pids leidos van a tener valor
if(kill(pids[i], SIGTERM) == -1){
fprintf(stderr, "Error al enviar una señal\n");
exit(EXIT_FAILURE);
}
}
}
/*Manejador: Manejador de señal*/
void Manejador(int num){
FinalizarProcesos();
printf("[Proceso padre] finaliza\n");
exit(EXIT_SUCCESS);
}
CODIGO DE HIJO
Código:
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
#include <sys/stat.h>
int main(int argc, char *argv[]){
/*Tratamiento de la linea de ordenes*/
if(argc != 2){
fprintf(stderr, "Error en el numero de argumentos\n");
return EXIT_FAILURE;
}
//Para las señales
sleep(10); //El hijo se ejecuta se duerme 10 seg y va ha inprimir el 1º caracter por tubería
//Ve como se matan los procesos hijos.
putchar(argv[1][0]); //El primer caracter en la salida estandar y escribe en la tuberia, imprime el primer caracter
return EXIT_SUCCESS;
}