{"id":180,"date":"2007-10-07T12:41:18","date_gmt":"2007-10-07T18:41:18","guid":{"rendered":"http:\/\/www.lastdragon.net\/?p=180"},"modified":"2007-10-07T13:33:26","modified_gmt":"2007-10-07T19:33:26","slug":"miltitarea-con-fork","status":"publish","type":"post","link":"https:\/\/www.lastdragon.net\/?p=180","title":{"rendered":"Multitarea en C usando Fork para OS tipo Unix"},"content":{"rendered":"<p>Varias personas me han preguntado c\u00f3mo hacer un programa multitarea en C, as\u00ed que he escrito este art\u00edculo para resolver de forma b\u00e1sica esta duda<\/p>\n<p>El siguiente es un ejemplo para usar multitarea en GNU\/Linux y otros tipos de Unix a base de Forks<\/p>\n<p>Forks es una rutina que clona un proceso, a mi gusto es lo m\u00e1s b\u00e1sico que se puede usar para multitarea, pues cada fork es un clone del padre, eso significa que tambi\u00e9n se clona la memoria, cada hijo consumo entonces la misma cantidad de memoria que el padre.<\/p>\n<p>En la mayor\u00eda de los programas clonados con fork ejecutaran una sola parte del total del c\u00f3digo, sin embargo, todo el c\u00f3digo que no se ejecute tambi\u00e9n estar\u00e1 en memoria duplicado por tantos hijos y nietos como se tengan, una mejor soluci\u00f3n a este problema ser\u00eda programaci\u00f3n de hilos, pero eso ser\u00e1 en otro articulo<\/p>\n<p>En el siguiente c\u00f3digo, el proceso padre, llamara a la funci\u00f3n misi\u00f3n, que esta a su vez a la funci\u00f3n hijo, la cual es una llamada a la funci\u00f3n fork, una vez ejecutado el fork, el proceso original del padre es clonado y ahora existe un nuevo proceso hijo id\u00e9ntico al padre que continua la ejecuci\u00f3n del padre en el mismo lugar donde fue clonado.<\/p>\n<p>Por lo que tanto padre como hijo contin\u00faan ejecutando el c\u00f3digo que incluyen, sin embargo mediante comprobaciones los procesos pueden saber si son hijos o padres.<\/p>\n<p>En la funci\u00f3n misi\u00f3n, se hace esta comprobaci\u00f3n con la l\u00ednea<\/p>\n<p>if (padre != getpid())<\/p>\n<p>como dije anteriormente al clonarse el proceso tambi\u00e9n se clonan sus variables, lo \u00fanico 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\u00f3n dar\u00e1 verdad y sabr\u00e1 que es el padre<\/p>\n<p>Una vez pasado el if el comportamiento de los programas deja de ser  cl\u00f3nico, por que el c\u00f3digo del if del padre da falso  y el del hijo verdadero y esto  hace a su vez que se ejecuten bloques de c\u00f3digos diferentes, el padre regresa al while de la funci\u00f3n main para lanzar una nueva misi\u00f3n, que ser\u00e1 otro hijo y hermano del primer clone<\/p>\n<p>Los hijos al terminar la misi\u00f3n tambi\u00e9n regresaran al while, pero aqu\u00ed se vuelve a comprobar si son el hijo o el padre<\/p>\n<p>if (padre != getpid ()) break;<\/p>\n<p>Los hijos que dar\u00e1n verdadera en esa comprobaci\u00f3n ejecutaran el break para romper el bucle del while y terminar, si no se hace esta comprobaci\u00f3n, los hijos lanzar\u00edan a su vez mas hijos eternamente hasta agotar la memoria del sistema<\/p>\n<p>la funci\u00f3n misi\u00f3n que se ejecuta en cada proceso clonado es simplemente contar y mostrar el valor de la cuenta en la pantalla<\/p>\n<blockquote>\n<p>#include stdio .h<br \/>\n#include unistd .h<\/p>\n<p>int hijo ()<br \/>\n{<br \/>\n        return fork ();<br \/>\n}<\/p>\n<p>int mision (int padre,int mision)<br \/>\n{<br \/>\n        hijo ();<\/p>\n<p>        if (padre != getpid())<br \/>\n        {<br \/>\n                int contador = 0;<br \/>\n                while (contador++ < 30000)\n                if (contador == 10000 || contador == 30000) printf (\"\\nEl hijo %d del padre %d llego esta en %d en la mision %d\",getpid(),padre,contador,mision);\n\n        }\n\n}\n\nint main ()\n{\n        int padre = getpid ();\n        int cmision = 0;\n\n        while (cmision < 1000)\n        {\n                if (padre != getpid ()) break;\n\n                mision (padre,cmision++);\n        }\n\n        sleep (15);\n        return 0;\n\n\n<\/p><\/blockquote>\n<p>Video del ejemplo<\/p>\n<p><object width=\"425\" height=\"350\"><param name=\"movie\" value=\"http:\/\/www.youtube.com\/v\/mN4Cy2Mn5QY\"><\/param><embed src=\"http:\/\/www.youtube.com\/v\/mN4Cy2Mn5QY\" type=\"application\/x-shockwave-flash\" width=\"425\" height=\"350\"><\/embed><\/object>\n<\/p><\/blockquote>\n","protected":false},"excerpt":{"rendered":"<p>Varias personas me han preguntado c\u00f3mo hacer un programa multitarea en C, as\u00ed que he escrito este art\u00edculo para resolver de forma b\u00e1sica 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&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3],"tags":[],"class_list":["post-180","post","type-post","status-publish","format-standard","hentry","category-programacion"],"_links":{"self":[{"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=\/wp\/v2\/posts\/180","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=180"}],"version-history":[{"count":0,"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=\/wp\/v2\/posts\/180\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=180"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=180"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=180"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}