Sie sind auf Seite 1von 4

ETSISI-U.P.M.

Sistemas Operativos IC Curso 15/16

Competencia transversal

Descripción y uso elemental de “fork”

Alumno: ________________________________________________

Matrícula: _________

Página - 0
ETSISI-U.P.M. Sistemas Operativos IC Curso 15/16

ÍNDICE

1 DESCRIPCIÓN DEL SERVICIO.....................................................................................................................2

2 ESPECIFICACIÓN...........................................................................................................................................2

3 EJEMPLOS DE USO........................................................................................................................................2

4 BIBLIOGRAFÍA...............................................................................................................................................3

Página - 1
ETSISI-U.P.M. Sistemas Operativos IC Curso 15/16

1 DESCRIPCIÓN DEL SERVICIO


La llamada al sistema operativo “fork” le permite a un proceso, denominado proceso Padre,
crear otro proceso que denominaremos Hijo.
El proceso Hijo será una réplica del proceso Padre (heredará tanto su código como sus datos)
y no compartirán memoria, tratándose por lo tanto de la creación de un proceso pesado.
A partir de la creación del nuevo proceso, tanto el Padre como el Hijo continuarán su
ejecución a partir de la instrucción siguiente a la que invocó a “fork”, pudiendo seguir
ejecuciones diferenciadas, si así lo desean, gracias a que tanto el Padre como el Hijo sabrán
quiénes son (prácticamente la única diferencia entre ambos tras la creación).
Si la llamada se ejecuta con éxito, el sistema registrará de alguna manera la relación existente
entre Padre e Hijo, de tal forma que el Hijo podrá saber quién es su Padre, y el Padre podrá,
por ejemplo, esperar a que termine la ejecución de su Hijo.
No existe un número máximo preestablecido del número de hijos que puede crear un padre
(dependerá de la cantidad de recursos del sistema) y, a su vez, el hijo podrá también crear
otros procesos que serán sus hijos y de los que, por lo tanto, él será el padre.

2 ESPECIFICACIÓN
La sinopsis de este servicio es la siguiente:

#include <unistd.h>

pid_t fork (void);

Si todo va bien, se crea un proceso Hijo como réplica del Padre (proceso que llama a “fork”),
devolviéndose al Padre el identificador del proceso Hijo recién creado, mientras que al Hijo se
le devolverá siempre un cero. El Hijo podrá saber quién es utilizando la llamada “getpid” y
también podrá saber quién es su padre mediante la llamada “getppid”.

Si algo falla, por ejemplo no hay memoria suficiente para replicar al Padre, la función
devolverá -1 y en la variable “errno” se indicará el error concreto que se produjo.

3 EJEMPLOS DE USO
El primer ejemplo de uso consistirá en crear un proceso de tal forma que, una vez creado, el
Padre diga quién es él y quién es su Hijo, mientras que el Hijo informe de quién es él y quién
es su Padre.

En la página siguiente puede observarse el código concreto para este primer ejemplo
(Programa 1).

En el Programa 2 vemos cómo un Padre crea un proceso Hijo y el Padre escribe Aes mientras
el Hijo escribe Bes. Si este programa se ejecuta en una máquina con más de un núcleo, se
percibirá claramente la ejecución simultanea de ambos procesos.

En el Programa 3 podemos ver otro ejemplo que, supuesto que falle la creación de un proceso
(se acaba algún recurso: memoria, etc.), se informa de cuál ha sido el código de error.

Página - 2
ETSISI-U.P.M. Sistemas Operativos IC Curso 15/16

#include <stdio.h>
#include <unistd.h>

main (void) {
int pid;

pid = fork();
if (pid == 0)
printf (“[H] MiPadre = %5d Yo = %5d\n”, getppid(), getpid());
else
printf (“[P] Yo = %5d MiHijo = %5d\n”, getpid(), pid);
}

Programa 1: Creado un proceso, cada proceso indica quién es él y quién el otro

#include <stdio.h>
#include <unistd.h>

void imprimirLetras (char letra) {


int i

for (i=0; i<1000; i++) {


printf (“%c”, letra);
if ((i%60) == 0) printf (“\n”);
}
printf (“\n”);
}

main (void) {
if (fork() == 0) imprimirLetras (‘B’);
else imprimirLetras (‘A’);
}

Programa 2: Proceso Padre escribe Aes y proceso Hijo Bes

#include <stdio.h>
#include <unistd.h>
#include <errno.h>

main (void) {
if (fork() == -1) printf (“Errno = %d\n”, errno);
}

Programa 3: Ejemplo de control de error en la creación de un proceso

4 BIBLIOGRAFÍA
1. PRÁCTICA 2. Llamadas al sistema. ETSISI-SisOpeIC. Septiembre 2015
2. Linux man page

Página - 3

Das könnte Ihnen auch gefallen