Существует библиотека (libvte, библиотека эмуляции терминала), которая использует пару файловых дескрипторов для пары pty master / slave. Мне нужно иметь возможность «украсть» мастер-файл из библиотеки для моего собственного использования (чтобы реализовать поддержку ZMODEM для очень редкого случая, когда единственная ссылка, которая у меня есть, на сеть - через терминал). Однако есть проблема.
Вы можете указать libvte, что вы хотите изменить дескриптор файла на новый, но затем он попытается закрыть используемый мастер и начать использовать вместо него новый. Это не будет работать, потому что, когда мастер закрыт, раб уходит. Первоначально я думал, что можно будет использовать dup()
на мастере pty, так что, когда libvte сделает close()
на мастере PTY, у меня все еще будет функционирующий fd для использования. Это явно неправильно.
Мне нужно найти способ:
- Блокирует операции libvte
read()
на fd.
- Увлекайте fd от libvte до тех пор, пока я его не использую (например, до тех пор, пока процесс
rz
, к которому я подключаю его, не завершится)
Возможно ли в системе POSIX выполнить одно из этих действий? Или был бы какой-то другой способ сделать то же самое, не исправляя сам libvte? Причина, по которой я спрашиваю, состоит в том, что решение должно работать на достаточном количестве существующих систем.
Если это вообще актуально, я взаимодействую с libvte (и непосредственно GTK +) через Python. Однако я бы не отказался от написания расширения Python на C, которое я мог бы затем вызвать из программы Python, потому что вам не нужно быть привилегированным в любой системе для загрузки расширения Python.
Если ничего из этого не возможно, я могу быть вынужден форкнуть libvte, чтобы сделать то, что я хочу, и распространить это с моей программой, но я не хочу этого делать - я не хочу быть попробую трепаться!