Esses são na verdade dois fenômenos completamente diferentes.
O less
em si não se preocupa em verificar se está em segundo plano (isso é típico dos programas que interagem com os terminais). O driver de terminal genérico no kernel rastreia qual é o processo no primeiro plano . Só pode haver um processo em primeiro plano (mais precisamente um grupo de processos). O shell faz uma chamada de sistema ( tcsetpgrp
) quando o fg
builtin é usado para Coloque um processo em primeiro plano. Essa chamada de sistema faz com que o processo especificado se torne o processo de primeiro plano.
Quando um processo tenta ler de um terminal², se ele não estiver em primeiro plano, o driver do terminal envia um sinal SIGTTIN ao processo. Por padrão, esse sinal suspende o processo (como um SIGSTOP). Da mesma forma, um processo em segundo plano que tenta gravar em seu terminal de controle recebe um SIGTTOU. A maioria das shells geralmente exibe uma mensagem como [1] + suspended (tty output) less myfile
quando isso acontece.
Para obter mais informações sobre terminais, consulte a descrição da interface geral do terminal no POSIX padrão. (Não é uma leitura fácil. É muito mais do que a maioria dos usuários e ainda mais programadores precisam saber.)
Um gerenciador de janelas não interage com terminais, portanto o conceito de processos de segundo plano e de primeiro plano em terminais não se aplica a ele. O que está acontecendo é que o servidor X termina quando a sessão X termina. O script que está chamando o gerenciador de janelas informa o que fazer na sessão. Se você colocar o gerenciador de janelas em segundo plano e deixar o script de sessão sair sem esperar pelo gerenciador de janelas, isso fará com que a sessão termine antes do esperado.
¹ O que grupo de processos , na verdade (por exemplo, um pipeline), mas não precisamos entrar nesse nível de detalhe aqui.
² Apenas para o seu controle de termina de fato.
³ a parte de back-end da GUI, que realiza ordens para desenhar janelas, ler entradas e afins de aplicativos