передача дескриптора файла в функцию библиотеки 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 компилируются разными компиляторами или с одним и тем же компилятором, но с разными параметрами), то каждая среда выполнения будет иметь свою собственную "эмуляцию дескриптора файла", и вы не можете передать дескриптор от одного к другому.