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

1

gnome-terminal tem o arquivo /dev/ptmx aberto:

Masxtermnãotemaberto:

Eupenseiquecadaemuladordeterminaldeveteroarquivo/dev/ptmxaberto,entãoporqueoxtermnãootemaberto?

Editar:Estaéasaídadels-ld"$(command -v xterm)" (em resposta a Stéphane Chazelas ):

    
por user7681202 28.04.2017 / 02:30

2 respostas

1

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

Existem diferentes configurações para pseudo-terminais, mas provavelmente o seu sistema usa este 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" é uma fachada ) usa algo semelhante (consulte src / pty.cc ).

Na prática, não é necessário continuar usando o descritor de arquivo para o dispositivo mestre. O xterm é executado como dois processos e usa esse descritor de arquivo em seu processo "pai". Ele descarta o descritor de arquivo para o dispositivo mestre em seu processo "filho" (veja fonte) .

Quando você executa o xterm, o processo filho é aquele com o qual seu shell fala, por exemplo, se você executar tty para ver qual terminal está usando ( que está usando o lado escravo do pseudo-terminal, e o lado mestre está fechado porque cada processo só precisa trabalhar com um lado do pseudo-terminal). / p>

O processo pai (que tem /dev/ptmx open) gerencia a exibição da janela X.

Dado tudo isso, eu esperaria ver lsof show xterm tendo /dev/ptmx aberto. Exceto:

  • em suas capturas de tela, a mensagem sugere que você não está executando como root e, se houver um problema de permissões com lsof , o que impede que ele veja todos os processos, isso poderia para a informação que falta.
  • seu xterm não está sendo executado na máquina em que você está executando lsof , por exemplo, se você tiver ssh na máquina (e acontecer de você estar vendo gnome-terminal em execução em uma sessão diferente).
por 28.04.2017 / 02:45
1

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

Suas permissões executáveis xterm têm o conjunto de bits S_ISGID (set-group-ID) e são de propriedade de grupo utmp .

Está configurado dessa forma para que xterm possa adicionar uma entrada em /var/run/utmp e /var/log/wtmp (os caminhos exatos podem variar dependendo do sistema) para que sua sessão seja exibida na saída de who ou last .

Com essas permissões, quando xterm for executado, o processo em execução verá seu ID de grupo efetivo mudar para o do grupo utmp (enquanto o id do grupo permanecerá o mesmo), que lhe dará permissão para abrir os registros de login utmp / wtmp no modo de gravação.

No Linux, como medida de segurança, apenas root pode listar os arquivos abertos de processos que possuem um id de usuário efetivo diferente do id do usuário real ou id de grupo efetivo diferente do id do grupo real. (você notará que, para tais processos, /proc/<pid>fd tem dr-x------ root root permissões, em comparação com dr-x------ you your-group para outros processos).

É por isso que lsof , quando executado como um usuário comum, não pode listar os arquivos abertos desse processo xterm . Você precisaria executar lsof como root .

Por que funciona para gnome-terminals , existem várias possibilidades:

  • gnome-terminal não adiciona entradas nos registros de login (esse é o caso no meu sistema)
  • gnome-terminal usa o utempter helper (que, nesse caso, é o que é sgid utmp ) para adicionar os registros de login. Isso é o que xterm e konsole fazem no meu sistema.
  • gnome-terminal redefine o ID do usuário efetivo para o ID do usuário real (libera temporariamente o% especialutmp access) depois de atualizar os registros de login (o que xterm não faz).
por 28.04.2017 / 17:54