o que acontece quando um gerenciador de janelas é colocado em segundo plano

2

Estou tentando entender a situação porque o arquivo .xsession espera que o último processo esteja em primeiro plano, caso contrário, ele deve parar a sessão X11.

Eu tenho um pequeno script autônomo. quando eu corro isso, ele sai imediatamente como 'menos' está em segundo plano.

$ ls -l total 4
-rwxr-xr-x 1 user user 17 Feb 28 21:17 a
-rw-r--r-- 1 user user  0 Feb 28 20:22 b 
$ cat a 
less b & 
echo $!
  1. Eu entendo que a ferramenta 'menos' interage primariamente em primeiro plano. Eu não sei como ele é implementado, mas eu acho que ele percebe que ele não roda mais em primeiro plano e não pode obter entrada ou mostrar alguma saída para o usuário, então não é mais útil executá-lo. Ou o que realmente está acontecendo?

  2. quando você coloca um 'gerenciador de janelas' em segundo plano, por que ele sai? Ele sai porque não é executado em primeiro plano e não pode receber nenhuma entrada de teclado / mouse através do servidor X e não pode mais ser útil para que ele saia?

por rag 28.02.2013 / 23:40

2 respostas

2

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

    
por 01.03.2013 / 00:25
2

Não há exigência de que o gerenciador de janelas esteja em primeiro plano, em segundo plano ou sob qualquer tipo de controle de tarefa. Você nem precisa executar um gerenciador de janelas se não quiser!

A única coisa importante é que, quando o script .xsession terminar, esse é o final da sua sessão. Se .xsession terminar, então o próprio servidor X terminará e quaisquer processos que ainda estiverem conectados a ele serão finalizados à força.

Portanto, um script .xsession é normalmente construído para que a última execução do script seja um processo de longa duração associado à sessão. Poderia ser o gerenciador de janelas ou poderia ser um gerenciador de sessão (mais típico em um ambiente sofisticado de desktop moderno). Esse processo é executado com exec para que ele substitua o shell que está executando .xsession ou seja executado como um processo de primeiro plano para que o shell espere por ele. De qualquer maneira, quando esse processo termina, a sessão termina.

Seu script de shell de exemplo inicia less no segundo plano e, em seguida, sai imediatamente. Não espera pelo processo em segundo plano. Ele sai independentemente de less ou não. less pode continuar sendo executado em segundo plano, mas o que quer que tenha iniciado seu script de shell não dará atenção a isso. Um script .xsession que é construído da mesma maneira terá o mesmo problema.

    
por 01.03.2013 / 00:12