Por que o xterm não tem o arquivo/dev/ptmx aberto?

Por que o xterm não tem o arquivo/dev/ptmx aberto?

gnome-terminaltenha o /dev/ptmxarquivo aberto:

insira a descrição da imagem aqui

Mas xtermnão está aberto:

insira a descrição da imagem aqui

Achei que cada emulador de terminal deveria ter o /dev/ptmxarquivo aberto, então por que o xterm não o abre?


Editar: Esta é a saída de ls -ld "$(command -v xterm)"(em resposta a Stéphane Chazelas):

insira a descrição da imagem aqui

Responder1

O Xterm está /dev/ptmxaberto, mas você não pode vê-lo assim. Aqui está o porquê.

Suas xtermpermissões executáveis ​​​​têm o S_ISGIDbit (set-group-ID) definido e são de propriedade do grupo utmp.

Ele está configurado dessa forma para que você xtermpossa adicionar uma entrada em /var/run/utmpand /var/log/wtmp(os caminhos exatos podem variar dependendo do seu sistema) para que sua sessão seja exibida na saída de whoor last.

Com essas permissões, quando xtermfor executado, o processo que o executa verá seueficazo ID do grupo muda para o do utmpgrupo (enquanto olero ID do grupo permanecerá o mesmo), o que lhe dará permissão para abrir os registros utmp/ wtmplogin no modo de gravação.

No Linux, como medida de segurança, só rooté possível listar os arquivos abertos de processos que possuem um ID de usuário efetivo diferente do ID de usuário real, ou um ID de grupo efetivo diferente do ID de grupo real. (você notará que, para tais processos, /proc/<pid>fdpossui dr-x------ root rootpermissões, em comparação com dr-x------ you your-groupoutros processos).

É por isso que lsof, ao executar como um usuário comum, não é possível listar os arquivos abertos desse xtermprocesso. Você precisaria executar lsofcomo root.

Quanto ao motivo pelo qual funciona gnome-terminals, existem várias possibilidades:

  • gnome-terminalnão adiciona entradas nos registros de login (é o caso do meu sistema)
  • gnome-terminalusa outempter ajudante(que nesse caso é o sgid utmp) para adicionar os registros de login. Isso é o que xtermfaço konsoleno meu sistema.
  • gnome-terminalredefine o ID do usuário efetivo para o ID do usuário real (renuncia temporariamente ao utmpacesso especial) depois de atualizar os registros de login (o que xtermnão acontece).

Responder2

Esse é o dispositivo mestre pseudo-terminal emLinux. Mas o xterm usa a função POSIX para abrir o pseudoterminal, que oculta os detalhes de abertura do dispositivo.

Existem configurações diferentes para pseudoterminais, mas provavelmente seu sistema usaeste pedaço:

#elif defined(HAVE_POSIX_OPENPT) && defined(HAVE_PTSNAME) && defined(HAVE_GRANTPT_PTY_ISATTY)
    if ((*pty = posix_openpt(O_RDWR)) >= 0) {
    char *name = ptsname(*pty);
    if (name != 0) {
        strcpy(ttydev, name);
        result = 0;
    }
}

VTE (o emulador de terminal real: "gnome-terminal" é umfachada) usa algo semelhante (vejasrc/pty.cc).

Na prática não é necessário continuarusandoo descritor de arquivo para o dispositivo mestre. xterm é executado como dois processos, eusaesse descritor de arquivo em seu processo "pai". Ele descarta o descritor de arquivo do dispositivo mestre em seuprocesso "filho" (ver fonte).

Quando você executa o xterm, oprocesso filhoé aquele com quem seu shell conversa, por exemplo, se você executarttypara ver qual terminal você está usando (ou seja, usando oescravolado do pseudo-terminal, e omestrelado é fechado porque cada processo só precisa trabalhar com um lado do pseudoterminal).

Oprocesso pai(que está /dev/ptmxaberto) gerencia a exibição da janela X.

Considerando tudo isso, eu esperaria ver lsofo show xterm aberto /dev/ptmx. Exceto:

  • em suas capturas de tela, a mensagem indica que você não está executando comoraiz, e se houver um problema de permissão lsofque o impeça de ver todos os processos, isso pode ser responsável pela falta de informações.
  • seu xterm não está realmente sendo executado na máquina em que você está executando lsof, por exemplo, se você fez ssh na máquina (e está vendo gnome-terminala execução em uma sessão diferente).

informação relacionada