передача файлового дескриптора функции библиотеки C через ctypes в windows - PullRequest
6 голосов
/ 09 февраля 2012

Я пытаюсь передать дескриптор файла через ctypes, функции C, где записи выполняются на fd.На Linux это работает.На Windows это не так, и я не понимаю, почему (у меня нет опыта в качестве разработчика для Windows)

//C func signature: 
void fun(struct bah *opaque, int fd)

из Python (детали опущены):

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 () с ошибочным утверждением _osfile (fh) & FOPEN

cl.exe: 16.00.40219.01 для x86 python 2.7.2 msc v.1500 32bit

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


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


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

1 Ответ

4 голосов
/ 09 февраля 2012

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

...