Evite sobrescrever o pipe nomeado existente

0

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}"
    
por Alexander Mills 23.04.2018 / 06:17

2 respostas

1

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.

    
por 23.04.2018 / 07:45
0

> 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:

  1. nenhum processo abriu o arquivo fifo para leitura ainda: então o open() (que é feito pelo shell antes que o comando seja executado) irá bloquear até que algum processo abra o arquivo para leitura.
  2. algum processo já abriu o arquivo fifo para leitura, mas nenhum para escrever ainda: então nosso 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.
  3. o pipe já foi instanciado (porque o arquivo fifo já foi aberto para leitura e escrita). Em seguida, o 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.

    
por 23.04.2018 / 10:42