Aqui estão algumas opções em que pensei, sem saber qual é a correta.
- Ocorreu um erro de E / S na leitura do tubo.
- O processo de gravação na outra extremidade do tubo morreu com uma falha.
- Todos os processos que poderiam gravar no canal o fecharam.
- O buffer de gravação do pipe está cheio.
- O ponto fechou a outra direção do tubo duplex.
- A gravação falhou porque não há processos que possam ler do canal.
- Uma chamada do sistema retornou o erro EPIPE e não havia nenhum manipulador de erros instalado.
Respostas:
Um processo recebe um SIGPIPE quando tenta gravar em um canal (nomeado ou não) ou soquete do tipo SOCK_STREAM que não possui nenhum leitor restante.
Geralmente é um comportamento desejado. Um exemplo típico é:
Você não deseja
find
continuar executando uma vezhead
finalizado (e depois fechou o único descritor de arquivo aberto para leitura nesse canal).O
yes
comando normalmente depende desse sinal para terminar.Irá escrever "y" até que algum comando termine.
Observe que não é apenas quando os comandos saem, é quando todos os leitores fecham suas leituras fd no canal. Em:
Haverá 1 (o subshell), depois 2 (subshell + sleep), depois 1 (subshell) e 0 leitura fd do canal após o subshell explicitamente fechar seu stdin, e é nesse momento
yes
que receberá um SIGPIPE.Acima, a maioria das conchas usa um
pipe(2)
tempoksh93
usa asocketpair(2)
, mas o comportamento é o mesmo nesse sentido.Quando um processo ignora a SIGPIPE, a chamada sistema de escrita (em geral
write
, mas poderia serpwrite
,send
,splice
...) retorna com umEPIPE
erro. Portanto, os processos que desejam manipular o tubo quebrado manualmente geralmente ignoram o SIGPIPE e agem com um erro do EPIPE.fonte
6)
Embora, a menos que você duplique descritores e bifurcações, só pode haver um processo para começar: geralmente um canal possui um leitor e um gravador e, quando um deles fecha a conexão, o canal está desativado. Se você estiver usando um canal nomeado, poderá fazer várias conexões (em série) com ele, mas cada uma representa um novo canal nesse sentido. Portanto, um "canal" para um encadeamento ou processo é sinônimo de um descritor de arquivo.
De
man 7 pipe
:Portanto, um "cano quebrado" é para o escritor o que é EOF para o leitor.
fonte
Um tubo quebrado ocorre quando o processo de leitura sai antes do processo de gravação. Então eu iria com (6)
fonte