Multitarea en C usando Fork para OS tipo Unix
By: Date: octubre 7, 2007 Categories: Programación

Varias personas me han preguntado cómo hacer un programa multitarea en C, así que he escrito este artículo para resolver de forma básica esta duda

El siguiente es un ejemplo para usar multitarea en GNU/Linux y otros tipos de Unix a base de Forks

Forks es una rutina que clona un proceso, a mi gusto es lo más básico que se puede usar para multitarea, pues cada fork es un clone del padre, eso significa que también se clona la memoria, cada hijo consumo entonces la misma cantidad de memoria que el padre.

En la mayoría de los programas clonados con fork ejecutaran una sola parte del total del código, sin embargo, todo el código que no se ejecute también estará en memoria duplicado por tantos hijos y nietos como se tengan, una mejor solución a este problema sería programación de hilos, pero eso será en otro articulo

En el siguiente código, el proceso padre, llamara a la función misión, que esta a su vez a la función hijo, la cual es una llamada a la función fork, una vez ejecutado el fork, el proceso original del padre es clonado y ahora existe un nuevo proceso hijo idéntico al padre que continua la ejecución del padre en el mismo lugar donde fue clonado.

Por lo que tanto padre como hijo continúan ejecutando el código que incluyen, sin embargo mediante comprobaciones los procesos pueden saber si son hijos o padres.

En la función misión, se hace esta comprobación con la línea

if (padre != getpid())

como dije anteriormente al clonarse el proceso también se clonan sus variables, lo único diferente es el PID o proceso ID del sistema operativo, asi que aunque la variable padre sigue valiendo el PID original, el nuevo proceso tiene un nuevo PID por lo que al hacer la revisar los PID el proceso clonado se da cuenta que es un hijo, en el caso del padre la comprobación dará verdad y sabrá que es el padre

Una vez pasado el if el comportamiento de los programas deja de ser clónico, por que el código del if del padre da falso y el del hijo verdadero y esto hace a su vez que se ejecuten bloques de códigos diferentes, el padre regresa al while de la función main para lanzar una nueva misión, que será otro hijo y hermano del primer clone

Los hijos al terminar la misión también regresaran al while, pero aquí se vuelve a comprobar si son el hijo o el padre

if (padre != getpid ()) break;

Los hijos que darán verdadera en esa comprobación ejecutaran el break para romper el bucle del while y terminar, si no se hace esta comprobación, los hijos lanzarían a su vez mas hijos eternamente hasta agotar la memoria del sistema

la función misión que se ejecuta en cada proceso clonado es simplemente contar y mostrar el valor de la cuenta en la pantalla

#include stdio .h
#include unistd .h

int hijo ()
{
return fork ();
}

int mision (int padre,int mision)
{
hijo ();

if (padre != getpid())
{
int contador = 0;
while (contador++ < 30000) if (contador == 10000 || contador == 30000) printf ("\nEl hijo %d del padre %d llego esta en %d en la mision %d",getpid(),padre,contador,mision); } } int main () { int padre = getpid (); int cmision = 0; while (cmision < 1000) { if (padre != getpid ()) break; mision (padre,cmision++); } sleep (15); return 0;

Video del ejemplo

7 thoughts on “Multitarea en C usando Fork para OS tipo Unix

  1. Usa: Mozilla Firefox Mozilla Firefox 2.0.0.7 en Windows Windows Vista - Detectado...

    ES POR ESO QUE ESTA WEB ES MEJOR QUE OTRAS ESTOS TEMAS DE PROGRAMACION NO SE VEN EN LAS PAGINAS DE LOS DIOSES ESCRIBE MAS DE ESTOS ARTICULOS

  2. Usa: Opera Opera 9.23 en Windows Windows XP - Detectado...

    Si ! por eso visito esta pagina last , no sigas poniendo mas de los pseudo-dioses pon este tipo de articulos sobre todo si se refieren a c/c++ . Saludos

  3. Usa: Mozilla Firefox Mozilla Firefox 2.0.0.7 en Windows Windows XP - Detectado...

    Ya apliquen la ley de godwin a los post, pero en lugar de cerrarlos cuando hablen de hitler, cierrenlos cuando se mencione a Megabyte.

    Definicion de la ley de Godwin
    A medida que una discusión en Internet se alarga, la probabilidad de que aparezca una comparación en la que se mencione a Hitler o a los nazis tiende a uno.

    Existe una tradición bastante generalizada en muchos grupos de noticias de Usenet: tan pronto como se haga tal comparación el hilo se cierra y quien quiera que haya mencionado a los nazis pierde automáticamente la discusión. De esta forma, la ley de Godwin prácticamente garantiza un límite en la longitud de las discusiones en Usenet y otros grupos. Para muchos la ley de Godwin consiste en sólo eso, desconociendo la definición original mencionada al inicio.

    Referencia:
    http://en.wikipedia.org/wiki/Godwin%27s_Law
    http://es.wikipedia.org/wiki/Ley_de_Godwin

  4. Usa: Mozilla Firefox Mozilla Firefox 2.0.0.7 en Windows Windows Vista - Detectado...

    LAST POR QUE EN EL VIDEO SE VE DIFERENTE EL CODIGO EL COMANDO SLEEP ES UNA DE ESAS DIFERENCIAS

  5. Usa: Internet Explorer Internet Explorer 7.0 en Windows Windows Vista - Detectado...

    Saludos bucio

    Inquisidor, el comando sleep era para dormir al padre un tiempo, aunque no es la función correcta, la use, el problema con los fork es que son, jerárquicos y los hijos dependen del padre

    asi que el nieto, depende del hijo del padre, por lo que si el padre de todos termina antes que los hijos, los hijos morirán con el padre incluso si no han terminado el proceso que estaban haciendo

    matar al proceso padre mata a los hijos también, por eso el padre debe esperar a sus hijos.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *