Não existe algo como “enviar EOF”. O fim do arquivo é atingido quando não há mais dados para ler.
No primeiro trecho, assim que o script Python sair, não haverá mais processo que tenha o canal aberto para gravação. Portanto, uma vez que foo tenha terminado de ler todos os dados que foram enviados no pipe, ele detecta uma condição de fim de arquivo em sua entrada padrão.
No segundo trecho, assim que o script Python sai, o pipe ainda é aberto pela subshell. Portanto, mesmo se foo terminar de ler todos os dados produzidos pelo script Python, ele continuará esperando por mais entradas. O subshell lança cat , que lê e encaminha dados de sua própria entrada padrão. Quando cat sai, a situação é a mesma de antes: não há mais processo que tenha o canal aberto para gravação e foo atingirá o final de sua entrada.
Quando um processo é bloqueado em uma chamada de sistema read , há vários motivos pelos quais a chamada do sistema pode retornar:
- Se os dados estiverem disponíveis,
readretornará um valor positivo e armazenará muitos bytes no buffer passados para ele. - Se o final do arquivo for atingido,
readretornará 0. Para um arquivo normal, isso acontece quando a posição do arquivo atinge o final do arquivo. Para um pipe, isso acontece quando o último processo que tinha o arquivo aberto morre e o buffer do pipe foi totalmente consumido. - Se algum erro ocorrer,
readretornará -1.