Como um pipeline sabe quando parar [duplicado]

13
    

Esta pergunta já tem uma resposta aqui:

    

Alguns programas podem ter um tempo de execução infinito e produzir uma saída infinita. Quando usado em um pipe com um comando que termina, como o pipeline sabe quando parar?

Por exemplo, use yes (saída infinita) com head :

 yes | head -n 5

Ele produzirá apenas 5 y .

O primeiro comando que finaliza aquele que interrompe os outros processos é input / output?
Como isso funciona ?

    
por Cyrbil 08.03.2016 / 10:22

1 resposta

18

Os comandos estão conectados a um pipe (estou falando aqui do primitivo do sistema - obviamente, eles estão conectados com um | ). Quando a extremidade de leitura do canal ( stdin de head ) se torna close d (== quando head explicitamente ( close ) ou implicitamente (saída) a fecha), tenta gravar no write end ( stdout of yes ) falhará.

Por padrão, isso não é apenas uma falha normal de errno , mas uma falha que faz com que o processo de gravação receba o sinal SIGPIPE . A ação padrão do manipulador do sinal SIGPIPE deve terminar.

Resumindo - se você gravar em um pipe quebrado, o sistema enviará a você um SIGPIPE e, por padrão, um SIGPIPE irá matar você. É por isso que yes termina quando head terminou (e, portanto, quebrou o canal).

Se você ignorar SIGPIPE no shell pai, os comandos herdarão essa disposição e um write em um canal corrompido simplesmente causará um erro errno de EPIPE . Conforme aparece, yes restringe esse erro e imprime:

$ (trap "" SIGPIPE; yes | head -n 5)  
y
y
y
y
yes: standard output: Broken pipe
yes: write error
    
por 08.03.2016 / 10:36

Tags