¿Por qué mkfifo se comporta como un LIFO?

Si lo hago.

mkfifo /tmp/a echo 'one'>/tmp/a 

mientras tanto desde otra terminal

 echo 'two'>/tmp/a 

y desde un tercer terminal

 more /tmp/a 

¿Por qué obtengo como salida del último command esto?

 two one 

Solutions Collecting From Web of "¿Por qué mkfifo se comporta como un LIFO?"

En

 echo 'one' > /tmp/a 

El shell hace un open(O_WRONLY) en la tubería y genera un echo que luego write("one\n") .

El open se bloqueará hasta que otro process abra el conducto en RD_ONLY o RD_WR .

Y también lo hará la open de tu echo two .

Entonces, en el momento en que haces more /tmp/a , tienes dos processs listos para disparar que no han abierto el fifo y aún less escrito nada. Cuál de esos dos se progtwigrá tan pronto como more el open(RD_ONLY) sea ​​aleatorio.

Para evitar el locking, podrías hacer:

 exec 3<> /tmp/a 

para desbloquear la tubería primero, y luego ejecutar sus commands que no se bloquearán hasta que la tubería esté llena.

Sin embargo, tenga en count que lo anterior funcionará en Linux, pero no en todos los Unix o Unix. El comportamiento al abrir una tubería en modo lectura-escritura no está especificado por POSIX.