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.

![[xml]](/images/xml.gif)
