¿Por qué xterm no tiene el archivo /dev/ptmx abierto?

¿Por qué xterm no tiene el archivo /dev/ptmx abierto?

gnome-terminaltener el /dev/ptmxarchivo abierto:

ingrese la descripción de la imagen aquí

Pero xtermno lo tiene abierto:

ingrese la descripción de la imagen aquí

Pensé que cada emulador de terminal debía tener el /dev/ptmxarchivo abierto, entonces, ¿por qué xterm no lo tiene abierto?


Editar: Este es el resultado de ls -ld "$(command -v xterm)"(en respuesta a Stéphane Chazelas):

ingrese la descripción de la imagen aquí

Respuesta1

Xterm tiene /dev/ptmxabierto, pero no puedes verlo así. Este es el por qué.

Sus xtermpermisos ejecutables tienen el S_ISGIDbit (set-group-ID) establecido y son propiedad del grupo utmp.

Está configurado de esa manera para que xtermpueda agregar una entrada en /var/run/utmpy /var/log/wtmp(las rutas exactas pueden variar según su sistema) para que su sesión se muestre en la salida de whoo last.

Con esos permisos, cuando xtermse ejecute, el proceso que lo ejecuta verá sueficazLa identificación del grupo cambia a la del utmpgrupo (mientras elleerLa identificación del grupo seguirá siendo la misma), lo que le dará permiso para abrir los registros utmp/ wtmpinicio de sesión en modo de escritura.

En Linux, como medida de seguridad, solo rootse pueden enumerar los archivos abiertos de procesos que tengan una identificación de usuario efectiva diferente a la identificación de usuario real, o una identificación de grupo efectiva diferente a la identificación de grupo real. (notarás que para dichos procesos, /proc/<pid>fdtiene dr-x------ root rootpermisos, en comparación con dr-x------ you your-groupotros procesos).

Es por eso que lsof, cuando se ejecuta como usuario normal, no se pueden enumerar los archivos abiertos de ese xtermproceso. Necesitarías ejecutar lsofcomo root.

En cuanto a por qué funciona gnome-terminals, hay varias posibilidades:

  • gnome-terminalno agrega entradas en los registros de inicio de sesión (ese es el caso en mi sistema)
  • gnome-terminalutiliza elutempter ayudante(que en ese caso es el que es sgid utmp) para agregar los registros de inicio de sesión. Eso es lo xtermque konsolehago en mi sistema.
  • gnome-terminalrestablece la identificación de usuario efectiva a la identificación de usuario real (renuncia temporalmente al utmpacceso especial) después de haber actualizado los registros de inicio de sesión (lo cual xtermno es así).

Respuesta2

Ese es el dispositivo maestro pseudo-terminal enlinux. Pero xterm usa la función POSIX para abrir el pseudoterminal, que oculta los detalles de apertura del dispositivo.

Existen diferentes configuraciones para pseudo-terminales, pero es probable que su sistema utiliceeste trozo:

#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 (el emulador de terminal real: "gnome-terminal" es unfachada) usa algo similar (versrc/pty.cc).

En la práctica no es necesario continuarusandoel descriptor de archivo para el dispositivo maestro. xterm se ejecuta como dos procesos, yusosese descriptor de archivo en su proceso "principal". Descarta el descriptor de archivo para el dispositivo maestro en suproceso "niño" (ver fuente).

Cuando ejecutas xterm, elproceso hijoes con el que habla tu shell, por ejemplo, si ejecutasttypara ver qué terminal está utilizando (es decir, utilizando elesclavolado del pseudo-terminal, y elmaestrolado está cerrado porque cada proceso solo necesita trabajar con un lado del pseudo-terminal).

Elproceso padre(que tiene /dev/ptmxabierta) gestiona la visualización de la ventana X.

Dado todo eso, esperaría ver lsofque xterm se haya /dev/ptmxabierto. Excepto:

  • en sus capturas de pantalla, el mensaje indica que no se está ejecutando comoraíz, y si hay un problema de permisos lsofque le impide ver todos los procesos, entonces eso podría explicar la información faltante.
  • su xterm en realidad no se está ejecutando en la máquina donde lo está ejecutando lsof, por ejemplo, si ha conectado ssh a la máquina (y resulta que está gnome-terminalejecutándose en una sesión diferente).

información relacionada