Por que o mkfifo se comporta como um LIFO?

7

Se eu fizer isso.

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

no tempo de outro terminal

echo 'two'>/tmp/a

e de um terceiro terminal

more /tmp/a

Por que eu obtenho como saída do último comando isso?

two
one
    
por sleax 03.11.2012 / 23:51

1 resposta

8

Em

echo 'one' > /tmp/a

O shell faz um open(O_WRONLY) no pipe e depois gera echo , que então faz o write("one\n") .

O open será bloqueado até que algum outro processo abra o canal em RD_ONLY ou RD_WR .

E também o open do seu echo two .

Então, no momento em que você faz more /tmp/a , você tem dois processos prontos para disparar que ainda não abriram o fifo, e muito menos escreveram alguma coisa para ele. Qual desses dois será agendado assim que more fizer o open(RD_ONLY) ser aleatório.

Para evitar o bloqueio, você pode fazer:

exec 3<>  /tmp/a

para desbloquear o pipe primeiro e, em seguida, executar seus comandos que não serão bloqueados até que o pipe esteja cheio.

Note, entretanto, que o acima funcionará no Linux, mas não em todos os Unix ou Unix-like. O comportamento ao abrir um pipe no modo de leitura e gravação não é especificado pelo POSIX.

    
por 04.11.2012 / 00:00