Можно ли повторно использовать подчиненный конец PTY после его закрытия?

Можно ли повторно использовать подчиненный конец PTY после его закрытия?

После использования конца ведомого устройства ( open(), read(), write(), close()), ведущее устройство read()завершается и возвращается с ошибкой EIO. Но я ожидал, что смогу выполнить open()/ close()несколько раз конец ведомого устройства, не нарушая работу ведущего fd.

Возможно ли сохранить два конца действительными после ведомого close()? Как мне сохранить мою "главную" программу работающей, когда конец ведомого закрыт? Должен ли я перезапустить всю grantpt(); unlockpt(); ptsname();последовательность?

решение1

Коротко: нет

Длинный: псевдотерминальное подчиненное соединение — это один конецсвязь, как труба. Оба способа передачи данных туда и обратно между пользовательскими процессами через ядро.

Как только один конец закрыт, вы теряете соединение. ptsnameОписание в POSIX гласит:

При неудаче ptsname()должен вернуть нулевой указатель. Это может произойти, если fildes являетсяневерный дескриптор файлаили если имя подчиненного устройства не существует в файловой системе.

После закрытия файлового дескриптора он становится недействительным.

Если вы хотите повторно использовать соединение, вы можете применить обходной путь, например, передать открытый дескриптор файла подчиненного сервера вновь созданному процессу, например, из серверного приложения, которое вы пишете для управления дескрипторами файлов подчиненных серверов.

Дальнейшее чтение:

Вышеизложенное было написано в 2016 году. В комментарии от 2022 года упоминаетсяTIOCGPTPEER, который представляет собой ioctlкод, позволяющий приложению получитьновыйдескриптор файла:

(начиная с Linux 4.13) Учитывая файловый дескриптор в fd, который ссылается на псевдотерминал master, открыть (с заданными флагами стиля open(2)) и вернуть новый файловый дескриптор, который ссылается на одноранговое псевдотерминальное подчиненное устройство. Эту операцию можно выполнить независимо от того, доступен ли путь к подчиненному устройству через пространство имен монтирования вызывающего процесса.

(закрытый файловый дескриптор все еще недействителен).

решение2

Согласно комментарию к другому ответу: Да, на самом деле.

Когда вы создаете пару pty, пусть ваш главный конечный процесс откроет подчиненный конец и держит его открытым. Таким образом, независимо от того, сколько клиентов открывают и закрывают подчиненный, его счетчик ссылок никогда не станет равным нулю, и он никогда не станет недействительным.

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