Redirecionar para um pipe nomeado não removerá o pipe, ele passará os dados pelo pipe ou bloqueará se nada estiver lendo do pipe.
Esta é a maneira normal de usar um pipe nomeado. Você cria e envia dados através dele.
Eu tenho este comando:
ql_receiver_lock_holder > "${my_named_pipe}"
substituirá o pipe nomeado, se já existir? É a melhor maneira de evitar sobrescrevê-lo para simplesmente usar isso:
ql_receiver_lock_holder >> "${my_named_pipe}"
>
faz um modo open()
in O_WRONLY|O_TRUNK
, enquanto >>
executa um modo open()
in O_WRONLY|O_APPEND
, mas para um pipe nomeado, isso não faz diferença.
3 casos diferentes a considerar:
open()
(que é feito pelo shell antes que o comando seja executado) irá bloquear até que algum processo abra o arquivo para leitura. open()
terá sucesso e instanciará o pipe. Em seguida, o comando será iniciado imediatamente e poderá gravar no canal onde os dados serão acumulados até que o canal fique cheio ou algum processo leia o conteúdo no outro lado. open()
retornará um fd para o mesmo pipe (não instanciar um novo). Isso significa que as gravações que nosso comando fizer serão intercaladas com as de outros comandos gravados no pipe. As gravações só terão a garantia de serem atômicas se menores que PIPE_BUF
(4KiB no Linux). Isso não é diferente dos canais regulares criados por pipe()
Um modo de abertura que faz a diferença é O_RDWR (leitura + gravação) que em shells você consegue com o operador <>
( 1<>
para redirecionar stdout, caso contrário ele abre em fd 0 (stdin)), que em muitos sistemas nunca bloqueiam e instanciam o pipe, se ainda não estiverem instanciados.
Tags bash shell-script fifo