我试图通过ctypes传递一个文件描述符到一个C函数,在fd上执行写操作。 在Linux上它工作。 在Windows上它不,我不明白为什么(我没有作为一个开发人员在Windows上的经验)
//C func signature: void fun(struct bah *opaque, int fd)
来自python(详情ommited):
mylib.fun.argtypes = [POINTER(bah), c_int] fh = open(filename,'wb') #doesn't work on windows, works on linux/unix mylib.fun(some_ctypes_struct, fh.fileno()) #doesn't work on windows mylib.fun(bah_struct, ctypes.cdll.msvcrt._open(filename,_O_FLAGS_MASK, ACCMASK) #doesn't work mylib.fun(bah_struct, os.open(...))
程序死于write()s,失败的断言_osfile(fh)&FOPEN
cl.exe:16.00.40219.01为x86 python 2.7.2 msc v.1500 32位
我该怎么做呢? 不,我不想卸载open()到lib。 我想以安全的方式传递已经打开的文件描述符,独立于平台。
附加信息,以防万一:库是tinycdb,我将其快速移植到Windows cmake规范和几个脏修补程序,使getopt和dll导出工作。 库和exe工具按预期工作(testing)。 tinycdb的python ctypes包装程序可以在linux上正常工作。 窗户给了我眼球。 他不会接受fd是一个有效的描述符,即使我打开它自己的(msvcrt)_open libcall后传递它。
当然,如果我在库中打开()ing / close()文件,但是我不能改变API,所有东西都可以工作。
Windows不像Unix那样使用文件描述,所以我假设文件描述符是由C运行时模拟的。 如果你正在使用两个不同的C运行时(例如,如果你的EXE和DLL是由不同的编译器编译,或者使用相同的编译器,但是有不同的选项),那么每个运行时都会有自己的“文件描述符模拟”将描述符从一个传递给另一个。