Почему в xterm не открыт файл /dev/ptmx?

Почему в xterm не открыт файл /dev/ptmx?

gnome-terminalоткройте /dev/ptmxфайл:

введите описание изображения здесь

Но xtermне открыл его:

введите описание изображения здесь

Я думал, что каждый эмулятор терминала должен /dev/ptmxоткрыть этот файл, так почему же xterm его не открывает?


Редактировать: Это вывод ls -ld "$(command -v xterm)"(в ответ на Стефан Шазелас):

введите описание изображения здесь

решение1

Xterm открылся /dev/ptmx, но вы не можете увидеть его таким образом. Вот почему.

Ваши xtermправа на исполнение имеют S_ISGIDустановленный бит (set-group-ID) и принадлежат группе utmp.

Он настроен таким образом, что xtermможет добавлять запись в /var/run/utmpи /var/log/wtmp(точные пути могут отличаться в зависимости от вашей системы), чтобы ваш сеанс отображался в выводе whoили last.

С этими разрешениями, когда xtermон будет запущен, процесс, который его запустит, увидит егоэффективныйидентификатор группы изменится на идентификатор группы utmp(при этомчитатьидентификатор группы останется прежним), что даст ей разрешение открывать записи utmp/ wtmplogin в режиме записи.

В Linux в качестве меры безопасности rootможно вывести список открытых файлов только тех процессов, у которых эффективный идентификатор пользователя отличается от реального идентификатора пользователя или эффективный идентификатор группы отличается от реального идентификатора группы (вы заметите, что для таких процессов /proc/<pid>fdсуществуют dr-x------ root rootразрешения, по сравнению с dr-x------ you your-groupдругими процессами).

Вот почему lsofпри запуске от имени обычного пользователя не может быть выведен список открытых файлов этого xtermпроцесса. Вам нужно запустить lsofот имени root.

Что касается того, почему это работает gnome-terminals, есть несколько возможностей:

  • gnome-terminalне добавляет записи в записи входа (это так в моей системе)
  • gnome-terminalиспользуетutempter помощник(который в этом случае является тем, который является sgid utmp) для добавления записей входа. Это то, что xtermи konsoleделаю в моей системе.
  • gnome-terminalсбрасывает эффективный идентификатор пользователя на реальный идентификатор пользователя (временно отказывается от особого utmpдоступа) после обновления записей входа (что xtermне происходит).

решение2

Это псевдотерминальное ведущее устройство наЛинукс. Но 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чтобы увидеть, какой терминал вы используете (то есть используетерабсторона псевдотерминала, ивладелецсторона закрыта, поскольку каждому процессу необходимо работать только с одной стороной псевдотерминала).

Theродительский процесс(который /dev/ptmxоткрыт) управляет отображением окна X.

Учитывая все это, я бы ожидал увидеть lsofshow xterm как /dev/ptmxоткрытый. За исключением:

  • на ваших снимках экрана сообщение намекает, что вы не работаете каккореньи если есть проблема с разрешениями, lsofкоторая не позволяет ему видеть все процессы, то это может быть причиной отсутствия информации.
  • Ваш xterm на самом деле не запущен на той машине, на которой вы работаете lsof, например, если вы подключились к машине по ssh (и случайно видите gnome-terminalзапущенный в другом сеансе).

Связанный контент