Questo è un comando pipe per la generazione di 10 caratteri della password a caso:Perché questa pipa è stata chiusa?
cat /dev/urandom | base64 | head -c 10
La mia domanda è cat /dev/urandom | base64
è un flusso di output infinito che non si fermerà da solo. Ma perché l'aggiunta di head -c 10
fa terminare l'intero tubo? Presumo cat
, base64
e head
sono 3 processi separati, come può head
terminare il cat
?
Probabilmente vale la pena menzionare che l'unica ragione per cui 'head' ottiene qualsiasi input è che' base64' scrive l'output dopo che ottiene una certa quantità di input, cioè quando il suo buffer è pieno. Se dovesse leggere fino a EOF, leggerà per sempre, e "head" non otterrebbe mai una crepa in nessuna di esse. Quindi una pipeline simile, come 'cat/dev/urandom | somma | head -c 10' si comporterebbe diversamente, poiché 'sum' aspetta EOF. –
s/gets errori di scrittura/riceve SIGPIPE/ –
Il commento di Rob è * estremamente * rilevante. Se il processo eredita un gestore SIGPIPE o ignora SIGPIPE (ad es. Se viene eseguito con il precedente modulo subprocess di python interpreti) e non controlla gli errori di scrittura, non si interromperà. Esiste una differenza * enorme * tra un errore di scrittura e la ricezione di SIGPIPE, ei programmi che ignorano entrambi i problemi sono soggetti a un funzionamento indefinito. –