Sou novo em programação de scripts bash e estou tentando entender o código abaixo:
tmp_file=/tmp/tmp_file$$
mkfifo $tmp_file
echo "msg_A" >$tmp_file # blocks, since pipe is unbuffered and no one is reading from it
read msg <$tmp_file
echo $msg
tmp_file=/tmp/tmp_file$$
mkfifo $tmp_file
exec 7<>$tmp_file # add this line
echo "msg_A" >$tmp_file # now, the write operation won't block, why?
read msg <$tmp_file
echo $msg # msg_A is printed
Quero saber o que acontece exec 7<>$tmp_file
no exemplo de código acima e por que adicionar esta linha torna a operação de gravação não bloqueante?
Não. Esse
exec
comando abre$tmp_file
(o que resolve para o nome de um FIFO) para leitura e escrita, e o deixa aberto , associado ao descritor de arquivo número 7 (dentro dessa execução do script).A outra parte relevante do exemplo de código é esta:
... e você tem um pequeno mal-entendido sobre isso. Não é a gravação no FIFO que bloqueia sem o
exec
. Em vez disso, é a tentativa do shell de abrir o FIFO em primeiro lugar, o que acontece antes de qualquer parteecho
dele ser executada. Veja Linux named pipes: não tão FIFO quanto pensado em Unix & Linux SE. (Embora essa questão pergunte especificamente sobre Linux, a semântica FIFO descrita é bem comum entre sistemas operacionais da família Unix.)Depois que
exec
o FIFO é aberto para leitura e escrita, até que o descritor de arquivo seja fechado, qualquer processo com permissões suficientes pode abrir o FIFO para leitura ou escrita sem bloqueio.