miércoles, 12 de marzo de 2014

PROGRAMACIÓN DE SOCKETS EN C

En este blog voy a intentar explicar de la forma más amena posible en qué consiste la programación de conectores en lenguaje C. Los ejemplos e implementaciones realizadas a lo largo de todo el blog están programadas y probadas bajo sistema Unix de HP (hp-ux) máquina Itanium, pero no debería ser mayor problema poder implementarlo en cualquier Linux o Unix de sistema propietario.
A lo largo del blog intentaré (en la medida en que pueda) incorporar ejemplos que van desde el programa cliente o servidor más sencillo pasando por un servido, un dispatcher multiproceso y finalmente un dispatcher multithread (más potente y compacto).
Todo este conocimiento está basado en años de experiencia programando y aprendiendo en entorno financiero en el que el proveedor del hardware y algún software eran de HP. 

En este blog también intentaré plasmar las experiencias variopintas que pueden aparecer en la programación multiproceso. Aquello que yo llamaba en su día "brujería" y que no es más que llegar a la conclusión de que en multiproceso puede darse el caso en que dos fork() seguidos pueda adelantarse el segundo al primero (por poner un ejemplo), es decir: el segundo proceso hijo se adelante al primer proceso hijo creado anteriormente por caprichos del hardware, el S.O. y la carga de trabajo. Y todo ello bajo la lupa de los pocos microsegundos de diferencia. También incluso los más expertos de estas multinacionales tienen bugs de programación en C y consultan estructuras de memoria para contabilizar procesos cuando lo mejor es revisar todos los procesos enviando una señal a cada uno.

Se podría escribir un libro entero. Quien sabe, quizá algún día me lo proponga. ;-)


Para empezar enseñaré como funciona un fork(). Es la función por excelencia en la generación de procesos en lenguaje C. fork() devuelve el número PID del proceso hijo cuando es el propio proceso padre y devuelve 0 en caso de ser el propio proceso hijo. Justo en esa llamada fork() el sistema hace una copia exacta del proceso actual que está ejecutando la llamada fork(), le asigna un nuevo número de proceso (pid) y cuando todo está listo sigue la ejecución despues del fork() teniendo en cuenta que ahora se están ejecutnado 2 procesos. 
Este ejemplo concreto hace que el proceso padre se muera "default: exit(0)" y el proceso hijo bajo esta situación pasará a depender del proceso 1 (init). Recuerda que el fork() devuelve 0 cuando se trata del proceso hijo. 
Aquí os dejo un video con la explicación: 
 

No hay comentarios:

Publicar un comentario