Programación en C

Llamada al sistema de horquilla en C

Llamada al sistema de horquilla en C
La llamada al sistema fork () se usa para crear procesos secundarios en un programa C. fork () se usa cuando se requiere procesamiento paralelo en su aplicación. La función del sistema fork () se define en los encabezados sys / types.h y unistd.h. En un programa en el que usa fork, también debe usar la llamada al sistema wait (). La llamada al sistema wait () se usa para esperar en el proceso padre a que finalice el proceso hijo. Para finalizar un proceso hijo, la llamada al sistema exit () se utiliza en el proceso hijo. La función wait () está definida en el encabezado sys / espera.h y la función exit () se define en el encabezado stdlib.h.

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.

Cómo cambiar los botones izquierdo y derecho del mouse en una PC con Windows 10
Es una norma que todos los dispositivos de mouse de computadora estén diseñados ergonómicamente para usuarios diestros. Pero hay dispositivos de mouse...
Emule los clics del mouse colocando el mouse con Clickless Mouse en Windows 10
El uso excesivo de un mouse o teclado en una postura incorrecta puede provocar muchos problemas de salud, como tensión, síndrome del túnel carpiano y ...
Agregue gestos del mouse a Windows 10 con estas herramientas gratuitas
En los últimos años, las computadoras y los sistemas operativos han evolucionado enormemente. Hubo un momento en que los usuarios tenían que usar coma...