Autor
|
Tema: Duda con un programa en C (Leído 4,274 veces)
|
Andrea0000
Desconectado
Mensajes: 5
|
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 #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
Mensajes: 2.399
Turn off the red ligth
|
#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
Mensajes: 5
|
Puede ser voy a ponerlo, gracias
|
|
|
En línea
|
|
|
|
K-YreX
|
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: #include <stdio.h> int main(int argc, char *argv[]) { printf("Numero de argumentos: %d\n\n", argc ); for(int i = 0; i < argc; ++i) { printf("Argumento %d: %s\n", i , argv [i ]); } }
|
|
« Última modificación: 28 Diciembre 2021, 08:23 am por K-YreX »
|
En línea
|
cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
|
|
|
@XSStringManolo
Hacker/Programador
Colaborador
Desconectado
Mensajes: 2.399
Turn off the red ligth
|
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: #define EJEMPLO argc int main(int argc, char *argv[]) { std::cout << EJEMPLO; return 0; }
Es exactamente lo mismo que: int main(int argc, char *argv[]) { std::cout << argc; return 0; }
}
|
|
|
En línea
|
Mi perfil de patrocinadores de GitHub está activo! Puedes patrocinarme para apoyar mi trabajo de código abierto 💖
|
|
|
K-YreX
|
Cierto, cierto. No me di cuenta en ese momento porque estaba contestando todavía con una legaña en el ojo 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í: #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
|
cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Duda en programa
Programación C/C++
|
Black Lotus
|
2
|
2,254
|
25 Diciembre 2012, 20:52 pm
por Black Lotus
|
|
|
DUDA CON MI PROGRAMA EN C
Programación C/C++
|
chelito033
|
0
|
1,654
|
21 Agosto 2013, 01:20 am
por chelito033
|
|
|
Duda: Programa devolviendo valor a otro programa
Programación C/C++
|
erest0r
|
6
|
3,972
|
3 Julio 2015, 01:38 am
por erest0r
|
|
|
Duda con programa en C++
Programación C/C++
|
EdgarKrieger
|
2
|
1,865
|
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
|
5,509
|
22 Noviembre 2018, 03:29 am
por Estudiante000000
|
|