1 of 9

Funciones Útiles

fork()

faq.utnso.com/fork

a.k.a: Como crear procesos Hijos

2 of 9

fork() Que es un proceso?

Proceso

ejecutando

- Código (solo lectura)

- Datos (memoria dinámica)

- Stack (asignaciones estáticas)

  • Identificador único (PID)
  • Padre único
  • Tres estructuras de memoria

3 of 9

Fork() – Introducción

Proceso Hijo (PID Y / PPID X)

Proceso en ejecución (PID x)

Proceso padre

(PID x)

fork()

¡Los dos procesos son iguales!

4 of 9

fork() Valor de Retorno??

-1→ Error

0 → Hijo

>0 → Padre

fork() es una función y como tal, tiene un valor de retorno que puede (y va a sernos) muy útil.

5 of 9

fork() Y entonces?

Los procesos son iguales, pero pueden hacer cosas totalmente distintas….

Capaz que es lo que puede servirles para el TP no?

int main() {

if ( fork() == 0 ) {

/* Lógica del proceso HIJO */

}

else {

/* Lógica del proceso PADRE*/

}

}

6 of 9

fork() Consideraciones

  • El proceso hijo comparte el entorno con el proceso padre. (Descriptores abiertos… CUIDADO!)

  • Al finalizar un hijo se recibe la señal SIGCHLD. (No se asusten lo vemos más adelante)

  • El proceso padre debe esperar el fin de el/los proceso/s hijo/s.

7 of 9

fork() Esperar Fin de los hijos

int main() {

int pid = fork();

waitpid(...);

return EXIT_SUCCESS;

}

Los procesos padre deben esperar el fin de los hijos para que no se conviertan en zombies...

8 of 9

fork() Control de hijos vivos?

int main() {

kill(pid, 0);

...

}

Para controlar si un proceso hijo sigue vivo se le puede enviar una señal… y dale que va con las señales...

Valores de Retorno:

0 -> El proceso existe

-1 -> El proceso no existe

9 of 9

fork() exec*() (La familia de exec())

Proceso en ejecución (PID x)

if (pid == 0) {

// hijo

execv(“/bin/ls”,NULL);

// nunca se ejecuta

exit(0);

}

else

{

// padre

wait (pid);

exit(0);

}

Cómo ejecutar un programa totalmente distinto