
решение1
Xterm открылся /dev/ptmx
, но вы не можете увидеть его таким образом. Вот почему.
Ваши xterm
права на исполнение имеют S_ISGID
установленный бит (set-group-ID) и принадлежат группе utmp
.
Он настроен таким образом, что xterm
может добавлять запись в /var/run/utmp
и /var/log/wtmp
(точные пути могут отличаться в зависимости от вашей системы), чтобы ваш сеанс отображался в выводе who
или last
.
С этими разрешениями, когда xterm
он будет запущен, процесс, который его запустит, увидит егоэффективныйидентификатор группы изменится на идентификатор группы utmp
(при этомчитатьидентификатор группы останется прежним), что даст ей разрешение открывать записи utmp
/ wtmp
login в режиме записи.
В 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
помощник(который в этом случае является тем, который является sgidutmp
) для добавления записей входа. Это то, что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.
Учитывая все это, я бы ожидал увидеть lsof
show xterm как /dev/ptmx
открытый. За исключением:
- на ваших снимках экрана сообщение намекает, что вы не работаете каккореньи если есть проблема с разрешениями,
lsof
которая не позволяет ему видеть все процессы, то это может быть причиной отсутствия информации. - Ваш xterm на самом деле не запущен на той машине, на которой вы работаете
lsof
, например, если вы подключились к машине по ssh (и случайно видитеgnome-terminal
запущенный в другом сеансе).