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 получить номер файлового дескриптора.
Пример тестового кода ниже.
  1. local ffi = require "ffi"
  2.  
  3.  
  4.  
  5. local lib = ffi.C
  6.  
  7.  
  8.  
  9. -- https://forum.farmanager. com/viewtopic.php?p=147610#p147610
  10.  
  11. local function safe_def(def) return pcall(ffi.cdef,def) end
  12.  
  13.  
  14.  
  15. safe_def([[
  16.  
  17.   int _fileno(struct FILE *stream);
  18.  
  19. ]])
  20.  
  21.  
  22.  
  23. local filemain = "testfileno"
  24.  
  25. local file1 = io.open(filemain.."-1.txt", "wb")
  26.  
  27. local file2 = io.open(filemain.."-2.txt", "wb")
  28.  
  29. local fd1 = lib._fileno(file1)
  30.  
  31. local fd2 = lib._fileno(file2)
  32.  
  33. --print(fd1)
  34.  
  35. --print(fd2)
  36.  
  37. far.Message(fd1)
  38.  
  39. far.Message(fd2)
  40.  
  41.  
  42.  
  43. io.close(file1)
  44.  
  45. 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 ?
Думаю, что возможно, но я этим заниматься не буду.