Fig 1: Flujo de trabajo básico de fork ()
En este artículo, le mostraré cómo usar la llamada al sistema fork () para crear procesos secundarios en C. Entonces empecemos.
fork () Sintaxis y valor de retorno:
La sintaxis de la función del sistema fork () es la siguiente:
pid_t fork (vacío);La función del sistema fork () no acepta ningún argumento. Devuelve un entero del tipo pid_t.
En caso de éxito, fork () devuelve el PID del proceso hijo que es mayor que 0. Dentro del proceso hijo, el valor de retorno es 0. Si fork () falla, devuelve -1.
Bifurcación simple () Ejemplo:
A continuación se muestra un ejemplo simple de fork ():
#incluir#incluir
#incluir
#incluir
#incluir
int main (void)
pid_t pid = fork ();
si (pid == 0)
printf ("Niño => PPID:% d PID:% d \ n", getppid (), getpid ());
salir (EXIT_SUCCESS);
más si (pid> 0)
printf ("Padre => PID:% d \ n", getpid ());
printf ("Esperando que termine el proceso hijo.\norte");
esperar (NULO);
printf ("Proceso hijo terminado.\norte");
demás
printf ("No se puede crear el proceso hijo.\norte");
return EXIT_SUCCESS;
Aquí, usé fork () para crear un proceso hijo a partir del proceso principal / padre. Luego, imprimí el PID (ID de proceso) y PPID (ID de proceso principal) del proceso secundario y principal. En el proceso padre, la espera (NULL) se usa para esperar a que finalice el proceso hijo. En el proceso hijo, exit () se usa para finalizar el proceso hijo. Como puede ver, el PID del proceso padre es el PPID del proceso hijo. Entonces, el proceso hijo 24738 pertenece al proceso padre 24731.
También puede utilizar funciones para hacer que su programa sea más modular. Aquí, usé processTask () y parentTask () funciones para los procesos hijo y padre respectivamente. Así es como se usa realmente fork ().
#incluir#incluir
#incluir
#incluir
#incluir
void childTask ()
printf ("Hola mundo \ n");
void parentTask ()
printf ("Tarea principal.\norte");
int main (void)
pid_t pid = fork ();
si (pid == 0)
childTask ();
salir (EXIT_SUCCESS);
más si (pid> 0)
esperar (NULO);
parentTask ();
demás
printf ("No se puede crear el proceso hijo.");
return EXIT_SUCCESS;
La salida del programa anterior:
Ejecución de varios procesos secundarios con fork () y Loop:
También puede usar el bucle para crear tantos procesos secundarios como necesite. En el siguiente ejemplo, he creado 5 procesos secundarios usando for loop. También imprimí el PID y PPID de los procesos secundarios.
#incluir#incluir
#incluir
#incluir
#incluir
int main (void)
para (int i = 1; i <= 5; i++)
pid_t pid = fork ();
si (pid == 0)
printf ("Proceso hijo => PPID =% d, PID =% d \ n", getppid (), getpid ());
salir (0);
demás
printf ("Proceso padre => PID =% d \ n", getpid ());
printf ("Esperando a que finalicen los procesos secundarios ... \ n");
esperar (NULO);
printf ("proceso hijo terminado.\norte");
return EXIT_SUCCESS;
Como puede ver, el ID del proceso principal es el mismo en todos los procesos secundarios. Entonces, todos pertenecen al mismo padre. También se ejecutan de forma lineal. Uno después del otro. Controlar los procesos secundarios es una tarea sofisticada. Si aprende más sobre la programación del sistema Linux y cómo funciona, podrá controlar el flujo de estos procesos de la forma que desee.
Ejemplo de la vida real:
Diferentes cálculos matemáticos complejos como md5, sha256, etc.La generación de hash requiere mucha potencia de procesamiento. En lugar de calcular cosas como esa en el mismo proceso que el programa principal, puede simplemente calcular el hash en un proceso hijo y devolver el hash al proceso principal.
En el siguiente ejemplo, he generado un código PIN de 4 dígitos en un proceso secundario y lo envío al proceso principal, el programa principal. Luego, imprimí el código PIN desde allí.
#incluir#incluir
#incluir
#incluir
#incluir
int getPIN ()
// usa PPID y PID como semilla
srand (getpid () + getppid ());
int secreto = 1000 + rand ()% 9000;
volver secreto;
int main (void)
int fd [2];
tubería (fd);
pid_t pid = fork ();
si (pid> 0)
cerrar (0);
cerrar (fd [1]);
dup (fd [0]);
int secretNumber;
size_t readBytes = read (fd [0], & secretNumber, sizeof (secretNumber));
printf ("Esperando PIN ... \ n");
esperar (NULO);
printf ("Bytes leídos:% ld \ n", readBytes);
printf ("PIN:% d \ n", númerosecreto);
más si (pid == 0)
cerrar (1);
cerrar (fd [0]);
dup (fd [1]);
int secreto = getPIN ();
escribir (fd [1], & secreto, tamaño de (secreto));
salir (EXIT_SUCCESS);
return EXIT_SUCCESS;
Como puede ver, cada vez que ejecuto el programa, obtengo un código PIN de 4 dígitos diferente.
Entonces, así es básicamente como se usa la llamada al sistema fork () en Linux. Gracias por leer este artículo.