有一个库(libvte,终端仿真库)为pty主/从对使用一对文件描述符。我需要能够从库中“窃取”主fd以供我自己使用(以便在极少数情况下实现对ZMODEM的支持,当我必须通过终端连接到‘网络’时)但是,有一个问题。
您可以告诉libvte您想将文件描述符更改为一个新的,但随后它会尝试关闭正在使用的主控形状,并开始使用新的主控形状。这不起作用,因为当主人关了门,奴隶就走了。最初,我认为在pty主机上使用dup()
是可能的,这样当libvte在pty主机上使用close()
时,我仍然可以使用一个功能正常的fd。这显然是错误的。
我需要找到一种方法:
阻止libvte对fd的read()
操作。
窃取FD远离LBVTE直到我正在使用它(例如,直到我将它连接到出口的rz
进程)
在POSIX系统上可以做这两件事吗或者有没有其他方法可以在不修补libvte本身的情况下完成同样的任务?我问的原因是,解决方案必须在相当数量的现有系统上工作。
如果它是相关的,我将通过Python与libvte(和GTK+本身)交互不过,我并不反对用c编写一个python扩展,然后可以从python程序调用它,因为您不必在任何系统上拥有加载python扩展的特权。
如果这一切都不可能,我可能会被迫用fork-libvte来做我想做的事情,并将其与我的程序一起分发,但我不想这样做——我不想被一个fork的维护卡住!
最佳答案
一种可能的解决方案是编写一个助手进程,该进程打开自己的pty主/从对,并在libvte
和在从pty上运行的实际目标程序之间插入:
+---------------+
| libvte |
| |
| pty master=|-----\
+---------------+ |
|
+---------------+ |
| helper proxy | |
| | |
| stdin/stdout=|-----/
| |
| pty master=|-----\
+---------------+ |
|
+---------------+ |
| target | |
| | |
| stdin/stdout=|-----/
+---------------+
您的助手进程通常只是通过数据,直到它看到ZMODEM流量然后它停止将数据传递给
stdin
/stdout
(最终结果是libvte
),而是通过单独的文件描述符将其传递给应用程序,甚至只调用rz
本身。