7 de Febrero, 2006

Entra uno, salen n

Dice una maldición china: ojalá te toque vivir tiempos interesantes, y en realidad no tengo claro que sea una maldición.

El otro día Rubén acudió a mi con un problema. Resulta que mantiene una estación meteorológica en el cabo de Santa Pola, todo con Software Libre y Linux, y el soft que usa recoge los datos por el puerto serie de un PC.

Le han pedido que pruebe otro soft, pero solo cuenta con una estación y debe seguir funcionando correctamente. Solución: que los datos de la estación se lean por los dos programas.

El primer apaño que no funcionó fue emplear tee(1), y probablemente porque la cosa no era tan fácil :). El programa tee es potente, pero no está diseñado para lo que necesitaba Rubén (filosofía UNIX, hacer una sola cosa, pero hacerla bien).

Le propusieron en pseudocódigo dos soluciones, una con mkfifo(3) y la otra con popen(3). Pero Rubén no anda muy puesto... así que la maldición hizo el resto.

He optado por emplear mkfifo(3). Se indica un fichero de entrada y se crean n FIFO (una tubería con nombre), de forma que mi programa lee de la estación y, si hay alguien esperando a leer en un FIFO, le copia lo leído.

El principal problema es que todos estos ingenios son bloqueantes, si abres un FIFO, tu proceso de bloquea hasta que alguien en el otro lado está listo para leer. Además hay problemas si escribes y no hay nadie al otro lado :D. Estas dos características son malas cuando tienes que proporcionar datos a varios lectores y uno de ellos puede fallar.

Lo he solucionado creando los FIFO no bloqueantes, pese a no tener claras todas las consecuencias, y empleando select(2) para estar seguro que hay alguien esperando antes de escribir. La consecuencia es que el que no esté atento perderá datos, pero no perjudicará al resto de lectores.

No sé si he hecho alguna burrada, pero Rubén dice que por ahora funciona, así que... De todas formas el programa es libre: repfile. Si alguien lo ojea y ve algo raro, que avise.

Dice una maldición china: ojalá te toque programar programas interesantes, y en realidad no tengo claro que sea una maldición.

Anotación por Juan J. Martínez, clasificada en: programming.

Hay 2 comentarios

Gravatar

Doy fe de que funciona...y correctamente :)
He creado dos fifos.
En uno de ellos esta funcionando wx200d y en el otro una maquina virtual vmware.
Llevo meses detras de solucionar este problema y al fin parece verse la luz :)

Gracias Juanjo.

por Ruben, en 2006-02-07 18:16:06

Gravatar

Lo he programado en un ratillo :D. Lo único que la he liado porque pensaba hacer 2 FIFO y al final lo he programado para n (toma cha!).

Me alegro que funcione :D

por Juanjo, en 2006-02-07 18:34:51

Los comentarios están cerrados: los comentarios se cierran automáticamente una vez pasados 30 días. Si quieres comentar algo acerca de la anotación, puedes hacerlo por e-mail.

Algunas anotaciones relacionadas: