Fork (Unix)
Part de | programació d'ordinadors |
---|---|
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]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 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]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]PHP
[modifica]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]Enllaços externs
[modifica]- La funció
fork
en PHP (anglès)