Fork (Unix)

De Viquipèdia
Dreceres ràpides: navegació, cerca

En informàtica, la crida de sistema fork s'utilitza en sistemes operatius UNIX o UNIX-like i permet que un procés es dupliqui, per exemple, per realitzar un segon tractament, paral·lelament al primer. Podem considerar la crida de sistema fork com el mecanisme més bàsic del que disposa el sistema operatiu per tal de crear nous processos.

Existeix una filiació entre els processos: el procés inicial és anomenat el pare i el nou, el fill. Tots els atributs de sistema del pare (com per exemple, els drets d'accés al sistema de fitxers) són tramesos al fill.

Sovint és millor reemplaçar els fork, que tenen un cost de rendiment alt, per la creació de fils d'execució.

La funció fork és molt emprada entre les aplicacions client servidor amb molts clients simultanis.

Funcionament de fork[modifica | modifica el codi]

El següent esquelet de codi en llenguatge C mostra com funciona la crida fork():

id_t pid = fork();

if (pid == 0)
{ 
// Aquí va el codi del procés fill
}
else if (pid > 0)
{ 
// Aquí va el codi del procés pare
}

Al procés fill fork torna el valor 0 i al procés pare torna el valor de l'identificador de procés (PID) del nou fill acabat de crear.

El procés pare pot esperar a que l'execució del procés fill acabi, o continuar la seva execució en paral·lel a l'execució del procés fill.

Sovint els processos fill, utilitzant la crida de sistema exec() per tal d'executar un programa completament diferent del programa pare.

Exemple[modifica | modifica el codi]

A sota hi ha un exemple de codi en llenguatge de programació C que permet fer-se una idea de com funciona la crida de sistema fork:

#include <stdio.h> /* printf, stderr, fprintf */
#include <unistd.h> /* _exit, fork */
#include <stdlib.h> /* exit */
#include <errno.h> /* errno */
 
int main(void)
{
 pid_t pid = fork();
 
 if (pid == 0)
 {
 /* Child process:
 * When fork() returns 0, we are in
 * the child process.
 * Here we count up to ten, one each second.
 */
 int j;
 for (j = 0; j < 10; j++)
 {
 printf("child: %d\n", j);
 sleep(1);
 }
 _exit(0); /* Note that we do not use exit() */
 }
 else if (pid > 0)
 { 
 /* Parent process:
 * When fork() returns a positive number, we are in the parent process
 * (the fork return value is the PID of the newly-created child process).
 * Again we count up to ten.
 */
 int i;
 for (i = 0; i < 10; i++)
 {
 printf("parent: %d\n", i);
 sleep(1);
 }
 exit(0);
 }
 else
 { 
 /* Error:
 * When fork() returns a negative number, an error happened
 * (for example, number of processes reached the limit).
 */
 fprintf(stderr, "can't fork, error %d\n", errno);
 exit(1);
 }
}

Aquest codi ha de generar quelcom similar a:

parent: 0
child: 0
child: 1
parent: 1
parent: 2
child: 2
child: 3
parent: 3
parent: 4
child: 4
child: 5
parent: 5
parent: 6
child: 6
child: 7
parent: 7
parent: 8
child: 8
child: 9
parent: 9

Llenguatges de programació i la funció fork[modifica | modifica el codi]

PHP[modifica | modifica el codi]

En PHP la funció fork s'utilitza de la següent forma:

<?php

$pid = pcntl_fork();
if ($pid == -1) {
//Error
die('Error a l'utilitzar la funció fork');
} else if ($pid) {
// Aquí va el codi del procés pare

//Es recull la informació del procés fill quan finalitza (evita els processos Zombie).
pcntl_wait($status); 
} else {
// Aquí va el codi del procés fill
}

?>

Vegeu també[modifica | modifica el codi]

Enllaços externs[modifica | modifica el codi]