Vous êtes sur la page 1sur 2

Crear procesos en Linux

Para crear procesos en Linux, hacemos uso de la funcin fork de POSIX. Es muy sencillo de
usar. Lo nico que requiere saber es que, los procesos en Linux, y en general, los procesos en
Unix, se identifican por un nmero entero llamado PID. En los sistemas Linux, hay un proceso
especial con PID igual a 1. Est reservado al proceso llamado init, que es el proceso de
arranque del ncleo. Un proceso puede crear varios procesos hijos (que tambin tendrn su
PID) y la particularidad de estos procesos, es que tienen un proceso padre, del cual los procesos
hijos lo conocen por su PPID (PID del padre).

Las libreras que hay que incluir en nuestros programas son:


#include <sys/types.h>
#include <unistd.h>

Antes de hacer la llamada a fork se encuentra el proceso padre en ejecucin. Tras la llamada a
fork, segn el valor de retorno se tiene que:
Menor que cero: Se produjo un error. El proceso original sigue en ejecucin.
0: Correspondiente al proceso hijo.
Mayor que cero: Correspondiente al proceso padre.
La estructura general para crear un proceso hijo es la siguiente:

pid_t child;
child = fork();

if (child < 0) {
/* Manejar aqu los errores */
}
else if (child == 0) {
/* Cdigo del proceso hijo */
}
else {
/* Cdigo para el proceso padre */
}
En el siguiente ejemplo, se crea un proceso hijo y se mete dentro de un bucle infinito. El proceso
padre simplemente se duerme 2 segundos ,esto se hace con la funcin sleep(int seg). Una vez
que acabe el proceso padre, nos interesa acabar con el proceso hijo para salir del programa de
forma ordenada. Para ello empleamos la llamada a la funcin kill del sistema. Esta funcin se
encuentra en la librera:
#include <signal.h>

Como parmetros, requiere el pid del proceso y la seal a mandar. Y es que, aunque la funcin
se llame kill, no slo sirve para matar un proceso. Para ver la lista completa, se puede emplear
en lnea de comandos la opcin -l.

$ kill -l

El ejemplo es el siguiente:

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <errno.h>
#include <signal.h>

int main (int argc, char **argv) {


pid_t child, parent;

parent = getpid();

/* Tras la llamada a fork():


+---------------------------------
| Retorna | Significado |

+---------+----------------------+
| -1 | Se produjo un error |
| 0 | Proceso hijo |
| >0 | Proceso padre |
+---------+----------------------+
*/

if ((child = fork()) < 0) {


fprintf (stderr, "%s: fall la creacin del proceso %s\n",
argv[0], strerror(errno));

return -1;
}
else if (child == 0) {
/* Estoy en el proceso hijo */
while(1) {
//printf ("Proceso hijo\n");
}
}

else {
/* Proceso padre */
/* En el proceso padre, el valor child
es el pid del hijo */
sleep(2);
}

/* El proceso que acabe antes, ejecutar lo siguiente.


Para este ejemplo ser el proceso padre */
printf ("El proceso padre: %d\n", parent);
printf ("El proceso hijo: %d\n", child);
printf ("Proceso padre \n");
//Enviamos la seal de terminacin al proceso hijo.
kill (child, SIGTERM);

return 0;

Vous aimerez peut-être aussi