Как вы можете определить, относится ли fd к псевдотерминалу внутри или снаружи? - PullRequest
0 голосов
/ 02 июня 2018

По крайней мере в Linux и NetBSD, isatty возвращает true для fds, открытых либо внутри (/dev/pts/0, /dev/ttyp0 и т. Д.), Либо снаружи (/dev/ptmx, /dev/ptyp0 и т. Д.) Псевдотерминалаи все операции tcgetxxx, которые я могу удобно проверить, также не различаются.В принципе, вы можете сказать, позвонив по номеру fstat, а затем посмотрев на st_rdev, но затем вы должны знать, какие номера устройств используются для чего, и это не согласуется во всех системах.

Есть липереносимым способом, учитывая произвольный открытый fd, для которого isatty возвращает true, чтобы определить, относится ли он к внешней стороне псевдотерминала?Псевдотерминалы определены только в POSIX, поэтому я не думаю, что существует какой-либо стандартный способ, но я надеюсь, что есть способ, который работает по крайней мере с текущим поколением Unix с открытым исходным кодом, без необходимостисоставьте таблицу номеров устройств для каждой поддерживаемой ОС.

(Это будет использоваться для lsof -подобного инструмента проверки, если вам интересно, почему я хочу знать.)

1 Ответ

0 голосов
/ 02 июня 2018

В соответствии с ptsname руководством :

char *ptsname(int fd);

Функция ptsname() возвращает имя подчиненное псевдотерминальное устройство, соответствующее master , на которое ссылается fd.

И оно не будет работать с ENOTTY, если

fd не относится к псевдотерминалу master устройство.

Таким образом, вы можете сначала позвонить isatty(), а затем ptsname().

И ptsname() является

СООТВЕТСТВУЮЩИМ POSIX.1-2001, POSIX.1-2008.

...