Atingir "ctrl-Z" no shell suspende o processo de primeiro plano atual, enviando-lhe um sinal STOP
. Isso (eu acredito) também resulta na entrada padrão do processo sendo desanexada do shell - agora é um processo em segundo plano.
O comando bg
envia um sinal CONTINUE
para o comando, mas não reconecta sua entrada padrão ao shell. Como o gato está aguardando a entrada padrão, ele permanece parado. Como você mencionou, o comando fg
de fato conecta a entrada padrão ao shell.
Quando você envia um sinal STOP
para o seu processo, o shell é notificado por um sinal CHILD e o coloca em segundo plano e acontece a mesma coisa.
Você pode ver a diferença quando clica em "ctrl-Z":
[1] + 8336 suspended cat
E quando você envia um sinal STOP
manualmente:
[1] + 8336 suspended (signal) cat