Quando eu faço
( sleep 1; read x ; echo x=$x; echo done ) &
então, com as configurações padrão do terminal, o trabalho é interrompido por SIGTTIN
.
Se eu fizer
( ( sleep 1; read x ; echo x=$x; echo done ) & )
o read
syscall dentro read
recebe EOF (retorna com 0)` e nenhuma parada por SITTIN acontece.
Qual é a explicação para esses comportamentos
Isso porque no segundo caso o comando em segundo plano será executado em um subshell e, como não há controle de trabalho nos subshells, o modo de segundo plano será falsificado redirecionando a entrada
/dev/null
e ignorando os sinaisSIGINT
e .SIGQUIT
Veja também estas respostas:
Processo em segundo plano do comportamento estranho do subshell
Processo iniciado por script não recebe SIGINT
O ` (sleep 123 &)` remove o grupo de processos do controle de tarefas do bash?
Processo encerrado antes de ser lançado em segundo plano