使用pipe()和fdopen()将数据从Python脚本传递到Windows中的C ++应用程序

我们有一些Linux / macOS应用程序,可以通过传递文件描述符并从中读取数据来与外界通信。通常这样做是为了传递stdin / stdout描述符,但是我们使用pipe(),效果很好。 MinGW / Windows除外。 在Windows下建议做相同工作的推荐方式是什么?传递整个文件句柄,还是有很好的方法来模拟类似小型int的描述符?

lili1030 回答:使用pipe()和fdopen()将数据从Python脚本传递到Windows中的C ++应用程序

在Windows中,C文件描述符在保留字段cbReserved2lpReserved2中的过程STARTUPINFO记录中继承。该协议未记录,但源与Visual C ++一起分发。使用此功能的C函数包括_[w]spawn函数家族和[_w]system。 (但是,[_w]system函数通常在这方面没有用,因为只有立即cmd.exe进程继承了父级的文件描述符。CMD不会将它们传递给子级进程。)

在Python 2.7中,os.pipe是通过调用CreatePipe来实现的,该_open_osfhandle返回管道的读写端的非继承文件句柄。然后,这些句柄通过os.spawnv用可继承的文件描述符手动包装,但是底层OS句柄仍然是不可继承的。要解决此问题,请通过os.dup复制文件描述符,该描述符内部复制一个可继承的文件句柄,然后关闭源文件描述符。例如:

pread,pwrite = os.pipe()
pwrite_child = os.dup(pwrite)
os.close(pwrite)

Python的subprocess模块通常是创建子进程的首选方式。但是,在这种情况下,我们不能使用subprocess,因为它不支持通过STARTUPINFO(*)继承文件描述符。下面是一个使用high-availability configurations的示例:

rc = os.spawnv(os.P_WAIT,'path/to/spam.exe',['spam','arg1','arg2'])

(*)Windows Python内部使用C运行时文件API(例如_wopen_read_write)是一种尴尬的情况,但是在某些情况下无法支持C文件描述符。它应该硬着头皮,直接将Windows文件API与OS文件句柄一起使用,这样至少会保持一致。

本文链接:https://www.f2er.com/3149890.html

大家都在问