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

 

 


Tema destacado:


  Mostrar Temas
Páginas: [1]
1  Programación / Programación C/C++ / Programacion en C en: 2 Enero 2022, 15:17 pm
Buenas he hecho este codigo pero me queda por implementar una linea de codigo acerca de read que lea un caracter de entrada de la tuberia fd[0] y la verdad no se como hacerlo. Se encuentra en el for: /*Espera a la finalizacion de los procesos hijos*/

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 10//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 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

/*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<NUM_HIJOS; i++){
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");
return EXIT_FAILURE;
break;
case 0: //Ejecucuion por el proceso hijo
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");
exit(EXIT_FAILURE);
}
break;
default: /*Ejecucion por el proceso padre*/
close(fd[1]);
break;
}
longitud_pid++; //Para tener un control de cuantas cosas hay dentro del pids, por ejemplo hola (longitud=1) mundo (longitud=2)
}

/*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)
}
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);
}
2  Programación / Programación C/C++ / 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);
}
Páginas: [1]
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines