diff --git a/fork-example/.gitignore b/fork-example/.gitignore new file mode 100644 index 0000000..e10e727 --- /dev/null +++ b/fork-example/.gitignore @@ -0,0 +1 @@ +/.metadata/ diff --git a/fork-example/fork-example/.cproject b/fork-example/fork-example/.cproject new file mode 100644 index 0000000..58252d3 --- /dev/null +++ b/fork-example/fork-example/.cproject @@ -0,0 +1,125 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/fork-example/fork-example/.gitignore b/fork-example/fork-example/.gitignore new file mode 100644 index 0000000..e10e727 --- /dev/null +++ b/fork-example/fork-example/.gitignore @@ -0,0 +1 @@ +/.metadata/ diff --git a/fork-example/fork-example/.project b/fork-example/fork-example/.project new file mode 100644 index 0000000..efe9a46 --- /dev/null +++ b/fork-example/fork-example/.project @@ -0,0 +1,26 @@ + + + fork-example + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + clean,full,incremental, + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + diff --git a/fork-example/fork-example/.settings/language.settings.xml b/fork-example/fork-example/.settings/language.settings.xml new file mode 100644 index 0000000..c38a2c7 --- /dev/null +++ b/fork-example/fork-example/.settings/language.settings.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/fork-example/fork-example/Debug/makefile b/fork-example/fork-example/Debug/makefile new file mode 100644 index 0000000..dd02504 --- /dev/null +++ b/fork-example/fork-example/Debug/makefile @@ -0,0 +1,43 @@ +################################################################################ +# Automatically-generated file. Do not edit! +################################################################################ + +-include ../makefile.init + +RM := rm -rf + +# All of the sources participating in the build are defined here +-include sources.mk +-include src/subdir.mk +-include subdir.mk +-include objects.mk + +ifneq ($(MAKECMDGOALS),clean) +ifneq ($(strip $(C_DEPS)),) +-include $(C_DEPS) +endif +endif + +-include ../makefile.defs + +# Add inputs and outputs from these tool invocations to the build variables + +# All Target +all: fork-example + +# Tool invocations +fork-example: $(OBJS) $(USER_OBJS) + @echo 'Building target: $@' + @echo 'Invoking: GCC C Linker' + gcc -o "fork-example" $(OBJS) $(USER_OBJS) $(LIBS) + @echo 'Finished building target: $@' + @echo ' ' + +# Other Targets +clean: + -$(RM) $(EXECUTABLES)$(OBJS)$(C_DEPS) fork-example + -@echo ' ' + +.PHONY: all clean dependents + +-include ../makefile.targets diff --git a/fork-example/fork-example/Debug/objects.mk b/fork-example/fork-example/Debug/objects.mk new file mode 100644 index 0000000..6b3fe02 --- /dev/null +++ b/fork-example/fork-example/Debug/objects.mk @@ -0,0 +1,8 @@ +################################################################################ +# Automatically-generated file. Do not edit! +################################################################################ + +USER_OBJS := + +LIBS := -lcommons + diff --git a/fork-example/fork-example/Debug/sources.mk b/fork-example/fork-example/Debug/sources.mk new file mode 100644 index 0000000..a1c58f7 --- /dev/null +++ b/fork-example/fork-example/Debug/sources.mk @@ -0,0 +1,17 @@ +################################################################################ +# Automatically-generated file. Do not edit! +################################################################################ + +OBJ_SRCS := +ASM_SRCS := +C_SRCS := +O_SRCS := +S_UPPER_SRCS := +EXECUTABLES := +OBJS := +C_DEPS := + +# Every subdirectory with source files must be described here +SUBDIRS := \ +src \ + diff --git a/fork-example/fork-example/Debug/src/fork-example.d b/fork-example/fork-example/Debug/src/fork-example.d new file mode 100644 index 0000000..0ef66e8 --- /dev/null +++ b/fork-example/fork-example/Debug/src/fork-example.d @@ -0,0 +1 @@ +src/fork-example.o: ../src/fork-example.c diff --git a/fork-example/fork-example/Debug/src/subdir.mk b/fork-example/fork-example/Debug/src/subdir.mk new file mode 100644 index 0000000..098f88b --- /dev/null +++ b/fork-example/fork-example/Debug/src/subdir.mk @@ -0,0 +1,24 @@ +################################################################################ +# Automatically-generated file. Do not edit! +################################################################################ + +# Add inputs and outputs from these tool invocations to the build variables +C_SRCS += \ +../src/fork-example.c + +OBJS += \ +./src/fork-example.o + +C_DEPS += \ +./src/fork-example.d + + +# Each subdirectory must supply rules for building sources it contributes +src/%.o: ../src/%.c + @echo 'Building file: $<' + @echo 'Invoking: GCC C Compiler' + gcc -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@)" -o "$@" "$<" + @echo 'Finished building: $<' + @echo ' ' + + diff --git a/fork-example/fork-example/RemoteSystemsTempFiles/.project b/fork-example/fork-example/RemoteSystemsTempFiles/.project new file mode 100644 index 0000000..5447a64 --- /dev/null +++ b/fork-example/fork-example/RemoteSystemsTempFiles/.project @@ -0,0 +1,12 @@ + + + RemoteSystemsTempFiles + + + + + + + org.eclipse.rse.ui.remoteSystemsTempNature + + diff --git a/fork-example/fork-example/src/fork-example.c b/fork-example/fork-example/src/fork-example.c new file mode 100644 index 0000000..6214743 --- /dev/null +++ b/fork-example/fork-example/src/fork-example.c @@ -0,0 +1,94 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +//Defino una variable para saber si tengo que checkear si estan vivos todos los hijos: +int bajas; +int cant_hijos; + + +t_list * hijos; +typedef struct datosHijo{ + char *nombre; + int pid; +}t_hijo; + +void chld_destroy(t_hijo* self){ + printf("Matamos a %s, con el PID: %d\n", self->nombre, self->pid); + free(self->nombre); + free(self); +} + +void chldKilled(int signum){ + int status; + if(cant_hijos > 0){ + t_hijo* hijo_a_matar; + hijo_a_matar=list_get(hijos,0); + printf("Chau %d\n",hijo_a_matar->pid); + //bajas++; + kill(hijo_a_matar->pid,SIGKILL); + waitpid(hijo_a_matar->pid,&status,0); + cant_hijos--; + printf("Ahora tengo %d hijos\n",cant_hijos); + list_remove_and_destroy_element(hijos,0,(void*)chld_destroy); + }else{ + printf("No tengo mas hijos para matar\n"); + } + +} + + +t_hijo * chld_create(char* name, int pid){ + t_hijo *proceso_hijo = malloc(sizeof(t_hijo)); + proceso_hijo->nombre = strdup(name); + proceso_hijo->pid = pid; + return proceso_hijo; +} + +void ejecucionHijo(int pid){ + while(pid == 0){ + printf("PID: %d, El proceso padre es: %d \n", getpid(), getppid()); + sleep(5); + } +} + +void ejecucionPadre(int pidHijo){ + printf("Creado un nuevo hijo--> PID: %d \n", pidHijo); + list_add(hijos, chld_create("Jorge", pidHijo)); + //sleep(4); +} + +int main(void){ + + + //Defino el manejador de la señal + signal(SIGCHLD, chldKilled); + + //Creo la lista + hijos = list_create(); + + //Seteo el control de los procesos hijos + bajas = 0; + cant_hijos = 0; + + //Seteo el pid del hijo para no generarlos de forma recursiva + int pidHijo = 0; + int i; + + for(i = 0; i < 10; i++){ + cant_hijos++; + pidHijo = fork(); + ejecucionHijo(pidHijo); + ejecucionPadre(pidHijo); + } + + //int status; + for(;;){ + sleep(10); + } +} diff --git a/fork-example/src/fork-example.c b/fork-example/src/fork-example.c index 364bb3c..b05aef0 100644 --- a/fork-example/src/fork-example.c +++ b/fork-example/src/fork-example.c @@ -3,15 +3,14 @@ #include #include #include +#include +#include #include //Defino una variable para saber si tengo que checkear si estan vivos todos los hijos: -bool bajas; +int bajas; +int cant_hijos; -void chldKilled(int signum){ - puts("procesosHijos = procesosHijos - 1\n"); - bajas = true; -} t_list * hijos; typedef struct datosHijo{ @@ -20,61 +19,73 @@ typedef struct datosHijo{ }t_hijo; void chld_destroy(t_hijo* self){ - printf("La palmo %s, con el PID: %d\n", self->nombre, self->pid); + printf("Matamos a %s, con el PID: %d\n", self->nombre, self->pid); free(self->nombre); free(self); } -void controlDeCabezas(void * cabeza){ - t_hijo* cabezaHijo = cabeza; - if(0 != kill(cabezaHijo->pid, 0)){ - chld_destroy(cabeza); - } +void chldKilled(int signum){ + int status; + printf("Vamos a matar al %d hijo\nSoy el padre: %d\n",bajas,getpid()); + t_hijo* hijo_a_matar; + hijo_a_matar=list_get(hijos,bajas); + printf("Chau %d\n",hijo_a_matar->pid); + list_remove_and_destroy_element(hijos,bajas,(void*)chld_destroy); + bajas++; + kill(hijo_a_matar->pid,SIGKILL); + waitpid(hijo_a_matar->pid,&status,0); + cant_hijos--; + printf("Ahora tengo %d hijos\n",cant_hijos); + } + t_hijo * chld_create(char* name, int pid){ - t_hijo *elWachin = malloc(sizeof(t_hijo)); - elWachin->nombre = strdup(name); - elWachin->pid = pid; - return elWachin; + t_hijo *proceso_hijo = malloc(sizeof(t_hijo)); + proceso_hijo->nombre = strdup(name); + proceso_hijo->pid = pid; + return proceso_hijo; } void ejecucionHijo(int pid){ while(pid == 0){ - printf("PID: %d, El ATR que me trajo al mundo es: %d \n", getpid(), getppid()); - sleep(2); + printf("PID: %d, El proceso padre es: %d \n", getpid(), getppid()); + sleep(5); } } void ejecucionPadre(int pidHijo){ - printf("Creado un wachin nuevo--> Documento: %d \n", pidHijo); - list_add(hijos, chld_create("El Brayan", pidHijo)); - sleep(4); + printf("Creado un nuevo hijo--> PID: %d \n", pidHijo); + list_add(hijos, chld_create("Jorge", pidHijo)); + //sleep(4); } int main(void){ + //Defino el manejador de la señal - signal(SIGCHLD, chldKilled); + signal(SIGUSR1, chldKilled); //Creo la lista hijos = list_create(); //Seteo el control de los procesos hijos - bajas = false; + bajas = 0; + cant_hijos = 0; //Seteo el pid del hijo para no generarlos de forma recursiva int pidHijo = 0; + int i; - for(int i = 0; i < 10; i++){ + for(i = 0; i < 10; i++){ + cant_hijos++; pidHijo = fork(); ejecucionHijo(pidHijo); ejecucionPadre(pidHijo); } - while(pidHijo != 0){ + int status; + for(;;){ sleep(10); } - - return EXIT_SUCCESS; }