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;
}