programas GUI cliente-servidor
Como vários outros programas GUI atualmente, desde 2008 lxterminal
tentou exibir todas as janelas do emulador de terminal a partir de um único processo, um por X display por usuário. Para fazer isso, ele tenta se conectar a um soquete existente pelo tipo de nome que você está vendo, que incorpora o nome de exibição e seu nome de usuário.
- Se a conexão for bem-sucedida, ela simplesmente despejará seu diretório atual e o vetor de argumento no soquete e sairá. Ele não usa passagem de descritor de arquivo para passar diretamente um descritor de arquivo aberto para seu diretório atual, mas o passa pelo nome.
- Se a conexão falhar, ele tentará se tornar o servidor de escuta nesse soquete. Ele lê mensagens que compreendem um diretório atual e um vetor argumento, e abre uma nova janela de emulação de terminal GUI para cada leitura, como se fosse seu próprio diretório atual e vetor de argumentos.
O efeito visível disso é que o primeiro programa lxterminal
que você invoca (e deixa em execução) opera de maneira síncrona, enquanto o segundo e os subsequentes não. Para observar isso, comece com no lxterminal
instâncias em execução, execute um emulador de terminal diferente e invoque
lxterminal & sleep 1 ; lxterminalde um shell. O shell retornará ao prompt após 1 segundo e mostrará apenas 1
lxterminal
de trabalho em execução.
O rxvt tem um recurso semelhante, mas é necessário invocar explicitamente o urxvtd
server e executar explicitamente o urxvtc
client. A execução de urxvt
simples não tenta nenhum shenanighans cliente-servidor.
Terminal GNOME somente funciona desta forma, em contraste. sempre passa o vetor de argumentos para um processo do servidor e, em seguida, sai. Existe, além disso, apenas o processo de um servidor por usuário, lidando com todos os monitores (e bugs da maneira que esse mecanismo inicializa, para inicializar).
insegurança
A criação de arquivos e sockets em /tmp
com nomes previsíveis é uma preocupação de segurança bem conhecida e lxterminal
compartilha isso. Os usuários podem pré-criar soquetes nos locais previsíveis com os quais lxterminal
s executados por outros usuários na mesma máquina tentarão conversar.
rxvt, por outro lado, usa um subdiretório não-gravável não-outro-gravável de cada diretório do usuário. Outra possibilidade para corrigir este problema com lxterminal
que igualmente não permitiria a outros usuários o acesso para substituir os sockets com os deles seria ter os sockets em /run/user/username/lxterminal
.
(O GNOME Terminal usa o Desktop Bus de nível de usuário para se comunicar entre clientes e seu servidor. Hoje em dia, o AF_LOCAL
de soquete mora em /run/user/username/
, onde não pode ser suplantado por outros usuários não privilegiados).
bugs
Um dos problemas que incomodam o GNOME Terminal é que ele ocupa muitos descritores de arquivos abertos no processo de servidor único para cada instância de uma emulação de terminal. Costumava ser 16; e agora é baixo para um "mero" 8.
lxterminal
usa 2, um dos quais é um descritor de arquivo aberto vazado para a conexão de soquete do processo do cliente. Abra e feche emulações de terminal suficientes e, eventualmente, lxterminal
ficará sem descritores de arquivos disponíveis. O seguinte, começando com nenhuma lxterminal
instâncias em execução, usou todos os descritores de arquivos disponíveis do servidor em pouco mais de um minuto em uma de minhas máquinas:
(ulimit -H -n 1024 ; lxterminal) & seq 0 1024 | while read -r i ; do lxterminal -e /usr/bin/true ; done
Leitura adicional
- não pode matar o processo de gedit de seu PID
- Executa várias instâncias de processo reais do gnome-terminal
- Fred Chien (2008-06-16). Adicione arquivos ausentes para compartilhamento de processos . 1f69f854d8ab1377888e18c759f11eae99da75b9. lxde / lxterminal. GitHub.
- Fred Chien (2008-06-16). adicione suporte ao compartilhamento de processos . 074ec09b779c0265a316d37742d2957146bcb141. lxde / lxterminal. GitHub.