передача дескриптора файла в функцию библиотеки C через ctypes в windows

Я пытаюсь передать файловый дескриптор через 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 32bit

Как я должен был сделать это? нет, я не хочу разгружать open() в lib. Я хочу передать уже открытый файловый дескриптор безопасным способом, независимым от платформы.


дополнительная информация, на всякий случай: библиотека-tinycdb, я быстро портировал ее в windows с короткой спецификацией cmake и несколькими грязными патчами, чтобы заставить getopt и dll экспортировать работу. библиотека и инструмент exe работают так, как ожидалось (протестировано). обертки python ctypes для tinycdb работают в linux, как и ожидалось. Windows дает мне глазное яблоко. он не примет FD-действительный дескриптор, даже если я передаю его после открытия его собственным (msvcrt) _open libcall.


конечно, все работает, если я открываю()ing/close () ING файл в библиотеке, но я не могу позволить себе изменить API.

1 ответов


Windows не использует описания файлов, как Unix, поэтому я предполагаю, что файловые дескрипторы эмулируются средой выполнения C. Если вы используете два разных времени выполнения C (например, если EXE и DLL компилируются разными компиляторами или с одним и тем же компилятором, но с разными параметрами), то каждая среда выполнения будет иметь свою собственную "эмуляцию дескриптора файла", и вы не можете передать дескриптор от одного к другому.