Enviar EOF para pipe nomeado - limpeza / secagem fifo

3

Se eu tiver alguns processos aleatórios lendo de um pipe nomeado:

tail -f MYNAMEDPIPED 
cat MYNAMEDPIPE | someOtherProc

Em outro lugar, tenho um identificador do MYNAMEDPIPED por nome. Existe uma maneira segura e limpa para parar o processo de cauda, excluindo MYNAMEDPIPED ou talvez de alguma forma "secar"?

Em outras palavras

MYNAMEDPIPED.noMoreDataIsComingThroughSoPleaseStopTailingThis()

:)

De um dos comentários, ele diz para enviar EOF para MYNAMEDPIPE. Mas não consigo descobrir como fazer isso.

Isso mostra a dificuldade que estou enfrentando:

link

    
por Alexander Mills 07.07.2017 / 20:38

1 resposta

0

Você não pode "enviar EOF". Simplesmente não há "caractere EOF" que passaria pelo pipe.

Normalmente, os programas Linux lêem a partir de um descritor de arquivo usando read (2) no modo de bloqueio, preenchendo um buffer com os dados recebidos e retornando a quantidade de caracteres lidos. Quando read retorna 0, ou seja, 0 bytes foram lidos, a maioria dos programas interpreta isso como fim de arquivo.

Um programa pode liberar seu lado do pipe antes que o buffer esteja cheio, usando fsync (2). Nesse caso, o read do leitor retornaria imediatamente, mesmo se o buffer estivesse vazio, retornando 0 como a quantidade de bytes de leitura.

Você pode observar isso executando cat , digitando alguns caracteres (não retorna) e pressionando Ctrl-D (o que causa um flush no terminal). Nesse momento, cat imprimirá os caracteres digitados. Pressione Ctrl-D novamente, e cat read retornará 0 bytes, fazendo com que cat considere ter alcançado o final do arquivo. Como o buffer de linha é usado, cat também imprime sua entrada quando você pressiona Return.

    
por 22.11.2018 / 20:59