
Responder1
O Xterm está /dev/ptmx
aberto, mas você não pode vê-lo assim. Aqui está o porquê.
Suas xterm
permissões executáveis têm o S_ISGID
bit (set-group-ID) definido e são de propriedade do grupo utmp
.
Ele está configurado dessa forma para que você xterm
possa adicionar uma entrada em /var/run/utmp
and /var/log/wtmp
(os caminhos exatos podem variar dependendo do seu sistema) para que sua sessão seja exibida na saída de who
or last
.
Com essas permissões, quando xterm
for executado, o processo que o executa verá seueficazo ID do grupo muda para o do utmp
grupo (enquanto olero ID do grupo permanecerá o mesmo), o que lhe dará permissão para abrir os registros utmp
/ wtmp
login 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>fd
possui dr-x------ root root
permissões, em comparação com dr-x------ you your-group
outros processos).
É por isso que lsof
, ao executar como um usuário comum, não é possível listar os arquivos abertos desse xterm
processo. Você precisaria executar lsof
como root
.
Quanto ao motivo pelo qual funciona gnome-terminals
, existem várias possibilidades:
gnome-terminal
não adiciona entradas nos registros de login (é o caso do meu sistema)gnome-terminal
usa outempter
ajudante(que nesse caso é o sgidutmp
) para adicionar os registros de login. Isso é o quexterm
façokonsole
no meu sistema.gnome-terminal
redefine o ID do usuário efetivo para o ID do usuário real (renuncia temporariamente aoutmp
acesso especial) depois de atualizar os registros de login (o quexterm
nã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ê executartty
para 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/ptmx
aberto) gerencia a exibição da janela X.
Considerando tudo isso, eu esperaria ver lsof
o 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
lsof
que 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á vendognome-terminal
a execução em uma sessão diferente).