Это мастер-устройство псевдотерминала в Linux. Но xterm использует функцию POSIX для открытия псевдотерминала, которая скрывает детали открытия устройства.
Существуют различные конфигурации псевдотерминалов, но, скорее всего, ваша система использует этот фрагмент:
#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 (фактический эмулятор терминала: «gnome-terminal» — это фасад ) использует нечто подобное (см. src/pty.cc).
На практике нет необходимости продолжать использование файлового дескриптора для главного устройства. xterm работает как два процесса и использует этот файловый дескриптор в своем «родительском» процессе. Он отбрасывает файловый дескриптор главного устройства в своем «дочернем» процессе (см. источник).
Когда вы запускаете xterm, дочерний процесс — это тот, с которым общается ваша оболочка, например, если вы запустите tty
, чтобы увидеть, какой терминал вы используете (то есть используете ведомая сторона псевдотерминала, а сторона ведущая закрыта, поскольку каждому процессу нужно работать только с одной стороной псевдотерминала).
родительский процесс (который имеет открытый /dev/ptmx
) управляет отображением окна X.
Учитывая все это, я ожидаю, что lsof
покажет, что xterm открыт /dev/ptmx
.За исключением:
lsof
, которая не позволяет ему видеть все процессы , то это может объяснить недостающую информацию. lsof
, например, если вы подключились к машине по ssh (и вы видите gnome-terminal
выполняется в другом сеансе).