Título: AYUDA POR FAVOR
Publicado por: Pitagoras en 29 Diciembre 2022, 00:00 am
Hola, necesito ayuda para resolver un problema de mi código. 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/*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#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; }
Título: Re: AYUDA POR FAVOR
Publicado por: RayR en 29 Diciembre 2022, 19:50 pm
Eso huele a código copiado, pero dando el beneficio de la duda: putchar(argv [1][0]); //El primer caracter en la salida estandar y escribe en la tuberia, imprime el primer caracter
*primer caracter*. ¿Cómo esperas que se muestre el nombre completo del archivo si sólo estás imprimiendo el primer caracter (algo que "tu" propio comentario explica :silbar:)? Y además tienes esto: #define NUM_HIJOS 10 ... pid_t pids[NUM_HIJOS];
pero la ruta que le pasas al programa puede tener más de 10 entradas, y de hecho, en tu caso, dices que son 17, así que estás provocando un desbordamiento de buffer. Y tienes estos for inconsistentes: for(i=1; i<argc; i++){ ... for(i=1; i<NUM_HIJOS; i++){
pero NUM_HIJOS no tiene por qué ser igual a argc. De hecho casi nunca lo será. Lo que debes hacer es reservar dinámicamente la memoria para pids de acuerdo al número de archivos (argc - 1), y en tus dos for usar argc como límite superior. Y esto: /*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; }
no tiene razón de ser. Sustitúyelo por un simple: close(fd[0]);
|