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

 

 


Tema destacado: Guía rápida para descarga de herramientas gratuitas de seguridad y desinfección


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Duda con un programa en C
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Duda con un programa en C  (Leído 3,818 veces)
Andrea0000

Desconectado Desconectado

Mensajes: 5


Ver Perfil
Duda con un programa en C
« en: 28 Diciembre 2021, 06:30 am »

Hola, no se muy bien como puedo especificar en mi codigo que en lugar de tener o crear 5 procesos hijos, se creen tantos procesos hijos como numero de argumentos hallan
Código:
#define _POSIX_SOURCE
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <signal.h>
#include <wait.h>

#define NUM_HIJOS 5//El numero de hijos debe ser tantos como numero de parametros haya
#define NOMBREHIJO "hijo"

void FinalizarProcesos();

void Manejador(int num);
pid_t pids[NUM_HIJOS];

int main(int argc, char *argv[]){
int i, j;
int pid;
/*Tratamiento de la linea de ordenes*/
if(argc != 2){
printf(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 los procesos hijos*/
for(i=0; i<NUM_HIJOS; i++){
switch(pids[i]=fork()){ //Se guarda el pid en la tabla de procesos
case -1:
fprintf(stderr, "Error en la creacion del proceso hijo\n");
FinalizarProcesos();
break;
case 0:
if(execl(NOMBREHIJO, NOMBREHIJO, argv[1], NULL) == -1){
fprintf(stderr, "Error en la ejecucioon del proceso hijo\n");
exit(EXIT_FAILURE);
}
break;
}

}
/*Espera a la finalizacion de los procesos hijos*/
for(i=0; i<NUM_HIJOS; i++){
pid=wait(NULL);
for(j=0;j<NUM_HIJOS; j++){
if(pid==pids[j]){
printf("[Preoceso padre] el proceso %d ha terminado\n", pid);
pids[j]=0; //0 para indicar que no existe el proceso
}
}
}
printf("[Proceso padre] finaliza\n");
return EXIT_SUCCESS;
}

/*FinalizarProcesos: Termina todos los procesos hijos vivos*/
void FinalizarProcesos(void){
int i;

for(i=0; i<NUM_HIJOS; i++){
if(pids[i] != 0){ //Solo se mata a los procesos hijos vivos
if(kill(pids[i], SIGINT) == -1){
fprintf(stderr, "Error al enviar una señal\n");
}
}
}
}

/*Manejador: Manejador de señal*/
void Manejador(int num){
FinalizarProcesos();
printf("[Proceso padre] finaliza\n");
exit(EXIR_SUCCESS);
}


En línea

@XSStringManolo
Hacker/Programador
Colaborador
***
Desconectado Desconectado

Mensajes: 2.397


Turn off the red ligth


Ver Perfil WWW
Re: Duda con un programa en C
« Respuesta #1 en: 28 Diciembre 2021, 07:32 am »

Código
  1. #define NUM_HIJOS argc

Esto?


En línea

Mi perfil de patrocinadores de GitHub está activo! Puedes patrocinarme para apoyar mi trabajo de código abierto 💖

Andrea0000

Desconectado Desconectado

Mensajes: 5


Ver Perfil
Re: Duda con un programa en C
« Respuesta #2 en: 28 Diciembre 2021, 08:10 am »

Puede ser voy a ponerlo, gracias
En línea

K-YreX
Moderador
***
Desconectado Desconectado

Mensajes: 1.008



Ver Perfil
Re: Duda con un programa en C
« Respuesta #3 en: 28 Diciembre 2021, 08:21 am »

Citar
Si intentas definir esa constante antes del main() tendrás problemas pues argc no existe en ese punto.
EDIT: Tenía mis dudas y tras probarlo, no da problemas (al menos en mi caso). Funciona correctamente.

Puedes usar directamente los parámetros de la función main():
  • argc -> Contiene el número de argumentos. Si no se pasa nada: argc = 1
  • argv -> Contiene los argumentos. Si no se pasa nada: argv[0] = <nombre_programa>

Prueba este código (con diferentes argumentos) para entenderlo mejor:
Código
  1. #include <stdio.h>
  2.  
  3. int main(int argc, char *argv[]) {
  4.  printf("Numero de argumentos: %d\n\n", argc);
  5.  
  6.  for(int i = 0; i < argc; ++i) {
  7.    printf("Argumento %d: %s\n", i, argv[i]);
  8.  }
  9. }
« Última modificación: 28 Diciembre 2021, 08:23 am por K-YreX » En línea

Código
  1. cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
@XSStringManolo
Hacker/Programador
Colaborador
***
Desconectado Desconectado

Mensajes: 2.397


Turn off the red ligth


Ver Perfil WWW
Re: Duda con un programa en C
« Respuesta #4 en: 28 Diciembre 2021, 18:32 pm »

El define antes del main funciona porque lo cambia el preprocesador. Es decir, no es una variable, si no un remplazo.

Al poner NUM_HIJOS, el preprocesador lo remplaza por la expresión que definiste. Por ejemplo:
Código
  1. #define EJEMPLO argc
  2.  
  3. int main(int argc, char *argv[]) {
  4.  std::cout << EJEMPLO;
  5.  return 0;
  6. }

Es exactamente lo mismo que:
Código
  1. int main(int argc, char *argv[]) {
  2.  std::cout << argc;
  3.  return 0;
  4. }
}

En línea

Mi perfil de patrocinadores de GitHub está activo! Puedes patrocinarme para apoyar mi trabajo de código abierto 💖

K-YreX
Moderador
***
Desconectado Desconectado

Mensajes: 1.008



Ver Perfil
Re: Duda con un programa en C
« Respuesta #5 en: 29 Diciembre 2021, 23:03 pm »

Cierto, cierto.
No me di cuenta en ese momento porque estaba contestando todavía con una legaña en el ojo  ;D

Otro pequeño detalle a tener en cuenta es que un programa ejecutado "sin argumentos", realmente se está ejecutando con un argumento: el nombre del programa. Es decir, si se ejecuta un programa sin argumentos, argc vale 1.
Si no se quiere contar este argumento, se podría hacer algo así:
Código
  1. #define NUM_HIJOS (argc - 1) // IMPORTANTE: Usar parentesis

Aunque personalmente preferiría usar argc directamente en vez del define.
Por lo demás, tema zanjado.
En línea

Código
  1. cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Duda en programa
Programación C/C++
Black Lotus 2 2,001 Último mensaje 25 Diciembre 2012, 20:52 pm
por Black Lotus
DUDA CON MI PROGRAMA EN C
Programación C/C++
chelito033 0 1,454 Último mensaje 21 Agosto 2013, 01:20 am
por chelito033
Duda: Programa devolviendo valor a otro programa
Programación C/C++
erest0r 6 3,532 Último mensaje 3 Julio 2015, 01:38 am
por erest0r
Duda con programa en C++
Programación C/C++
EdgarKrieger 2 1,649 Último mensaje 28 Enero 2016, 03:24 am
por EdgarKrieger
Programa C++ Tengo una duda con respecto a este programa. « 1 2 »
Programación C/C++
Estudiante000000 16 4,562 Último mensaje 22 Noviembre 2018, 03:29 am
por Estudiante000000
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines