Se eu fizer o bash como o primeiro processo invocado (ou seja, como init), como resultado, ele exibirá o seguinte:
init: cannot set terminal process group (-1): Inappropriate ioctl for device
init: no job control in this shell
E nenhum sinal (por exemplo, ^C, ^Z) funciona.
Através da leitura do código fonte do bash-5.1.12, o problema está localizado na expressão da job.c
linha 4501:
(t = tcgetpgrp (shell_tty)) == -1
O valor do erro é ENOTTY
, o que significa que o processo de chamada não possui um terminal de controle.
Por que o Bash está sem um terminal de controle quando invocado como init?
O terminal de controle de
bash
é preparado (aberto) porlogin
. Portanto, sebash
for invocado diretamente como init skipinglogin
, ele lançará esse problema acima porque o terminal de controle desempenha um papel especial no tratamento dos sinais.De acordo com o código-fonte login.c (em
util-linux
), o processo de invocaçãobash
élogin
aproximadamente o seguinte:main() invoca fork_session()
Fork um novo processo. (em
fork_session()
função)Faça o novo processo como líder de sessão. Para adquirir um terminal de controle, o processo deve se tornar um líder de sessão antes. (em
fork_session()
função)Adquira um tty de controle para o líder da sessão. O líder da sessão adquire um terminal de controle por
open
um tty. (emfork_session()
função)Execute um shell de login no novo processo. (retorno em
main()
)Mais links sobre o conceito de terminal de controle :