elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Estamos en la red social de Mastodon


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  AYUDA POR FAVOR
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: AYUDA POR FAVOR  (Leído 5,438 veces)
Pitagoras

Desconectado Desconectado

Mensajes: 29


Ver Perfil
AYUDA POR FAVOR
« 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

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;

}



En línea

RayR

Desconectado Desconectado

Mensajes: 239


Ver Perfil
Re: AYUDA POR FAVOR
« Respuesta #1 en: 29 Diciembre 2022, 19:50 pm »

Eso huele a código copiado, pero dando el beneficio de la duda:

Código
  1. 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:

Código
  1. #define NUM_HIJOS 10
  2. ...
  3. 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:

Código
  1. for(i=1; i<argc; i++){
  2. ...
  3. 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:
Código
  1.            /*Redireccion de la entrada estandar al archivo*/
  2.            if ((fd[0] = open(argv[1], O_RDONLY)) == -1){
  3.                fprintf(stderr, "Error en la apertura del archivo de datos\n");
  4.                return EXIT_FAILURE;
  5.            }

 no tiene razón de ser. Sustitúyelo por un simple:

Código
  1. close(fd[0]);


En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Ayuda por favor
Ejercicios
MateoDSC 2 3,866 Último mensaje 14 Octubre 2005, 23:36 pm
por -sagitari-
AYUDA -.- ahora no entro más en 4chan (tengo una duda, ayuda por favor)
Foro Libre
Draklit 6 8,763 Último mensaje 15 Octubre 2010, 03:14 am
por Draklit
creo que dañe mi router por favor ayuda no c que hacer por favor ayuda
Redes
ddiego84 2 2,922 Último mensaje 2 Febrero 2016, 23:05 pm
por IBE
[AYUDA] Por favor ayuda con imagenes en html
Desarrollo Web
gramsch 3 2,414 Último mensaje 24 Febrero 2016, 21:35 pm
por Pantera80
necesito ayuda para hecer este programa, por favor ayuda
Programación C/C++
LARANARENElol 2 4,162 Último mensaje 16 Noviembre 2018, 03:00 am
por LARANARENElol
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines