Page 1 of 1
[LUA][FFI][msvcrt.dll][_fileno] FAR Manager возвращает неверное значение
Posted: Thu 07 Dec, 2017 22:31
by kasru
Получаю номер файлового дескриптора с помощью ф-ци _fileno из msvcrt.dll, чтобы в дальнейшем использовать его.
На тестах в IDE ZeroBrane Studio _fileno работает верно, возвращает число в пределах от 3 до 255. а в FAR Manager нет. возвращает 0, большие или отрицательные числа. Подскажите что я делаю не так или как в FAR Manager получить номер файлового дескриптора.
Пример тестового кода ниже.
local ffi = require "ffi"
local lib = ffi.C
-- https://forum.farmanager. com/viewtopic.php?p=147610#p147610
local function safe_def(def) return pcall(ffi.cdef,def) end
safe_def([[
int _fileno(struct FILE *stream);
]])
local filemain = "testfileno"
local file1 = io.open(filemain.."-1.txt", "wb")
local file2 = io.open(filemain.."-2.txt", "wb")
local fd1 = lib._fileno(file1)
local fd2 = lib._fileno(file2)
--print(fd1)
--print(fd2)
far.Message(fd1)
far.Message(fd2)
io.close(file1)
io.close(file2)
[LUA][FFI][msvcrt.dll][_fileno] FAR Manager возвращает неверное значение
Posted: Thu 07 Dec, 2017 23:11
by John Doe
Пример, запущенный через luajit, печатает 3,4 (стабильно)
Пример, запущенный через lfjit, печатает два больших непоследовательных числа, разными от запуска к запуску.
[LUA][FFI][msvcrt.dll][_fileno] FAR Manager возвращает неверное значение
Posted: Fri 08 Dec, 2017 05:00
by Shmuel
Нигде в документации не сказано, что io.open возвращает FILE*. Там сказано "It returns a new file handle", а это не одно и то же. Поэтому, даже если при каких-то обстоятельствах этот код у вас работает, нет гарантии, что при очередном обновлении LuaJIT, например, он не поломается.
Если уж пользуетесь FFI - вызывайте fopen, fclose и т.д., а не io.open.
[LUA][FFI][msvcrt.dll][_fileno] FAR Manager возвращает неверное значение
Posted: Fri 08 Dec, 2017 07:29
by kasru
И всё таки, если io.open - "It returns a new file handle". То вопрос можно задать по другому, как из "file handle" получить FILE* или номер файлового дескриптора, ведь внутри реализации LuaJIT где то LUA должен хранить какой то "file handle" операционной системы.
Может где в исходниках LuaJIT посмотреть или подскажите какой форум разработчиков LuaJIT.
[LUA][FFI][msvcrt.dll][_fileno] FAR Manager возвращает неверное значение
Posted: Fri 08 Dec, 2017 07:31
by kasru
из каких исходиков собирается LuaJIT для Far Manager? т.е. где можно посмотреть на исходики LuaJIT для Far Manager.
[LUA][FFI][msvcrt.dll][_fileno] FAR Manager возвращает неверное значение
Posted: Fri 08 Dec, 2017 07:52
by John Doe
Shmuel wrote: ↑Fri 08 Dec, 2017 05:00Нигде в документации не сказано, что io.open возвращает FILE*.
http://luajit.org/ext_ffi_semantics.htm ... rt_fromlua
Мне казалось, что тут как раз этот случай.
[LUA][FFI][msvcrt.dll][_fileno] FAR Manager возвращает неверное значение
Posted: Fri 08 Dec, 2017 08:00
by Shmuel
kasru wrote: ↑Fri 08 Dec, 2017 07:29ведь внутри реализации LuaJIT где то LUA должен хранить какой то "file handle" операционной системы
Программы и скрипты не должны полагаться на ВНУТРЕННЮЮ реализацию используемых библиотек. Ваш нерабочий пример это хорошо иллюстрирует.
kasru wrote: ↑Fri 08 Dec, 2017 07:29Может где в исходниках LuaJIT посмотреть
Библиотека
io
, предоставляемая LuaJIT, не используется, она переопределена в LuaFAR. Смотрите исходники LuaFAR в репозитории Far Manager.
kasru wrote: ↑Fri 08 Dec, 2017 07:31где можно посмотреть на исходики LuaJIT для Far Manager
LuaJIT используется стандартный, без изменений, версия 2.1-beta3. Можно скачать с сайта LuaJIT.
[LUA][FFI][msvcrt.dll][_fileno] FAR Manager возвращает неверное значение
Posted: Sat 09 Dec, 2017 11:14
by Shmuel
kasru, сейчас добавил метод rawhandle
, возвращающий FILE*
. Будет в следующей ночной сборке.
Пример использования: local fd1 = lib._fileno(file1:rawhandle())
[LUA][FFI][msvcrt.dll][_fileno] FAR Manager возвращает неверное значение
Posted: Sat 09 Dec, 2017 20:45
by kasru
Shmuel wrote: ↑Sat 09 Dec, 2017 11:14kasru, сейчас добавил метод rawhandle, возвращающий FILE*. Будет в следующей ночной сборке.
Пример использования: local fd1 = lib._fileno(file1:rawhandle())
Спасибо, а возможно сделать сразу конвертацию в FILE*, без метода rawhandle ?
[LUA][FFI][msvcrt.dll][_fileno] FAR Manager возвращает неверное значение
Posted: Sun 10 Dec, 2017 06:47
by Shmuel
kasru wrote: ↑Sat 09 Dec, 2017 20:45а возможно сделать сразу конвертацию в FILE*, без метода rawhandle ?
Думаю, что возможно, но я этим заниматься не буду.