[LUA][FFI][msvcrt.dll][_fileno] FAR Manager возвращает неверное значение

Столкнулись с проблемой в использовании макросов? Здесь можно получить помощь.
Post Reply
kasru
Posts: 5
Joined: Wed 28 Mar, 2012 14:07
Has thanked: 2 times

[LUA][FFI][msvcrt.dll][_fileno] FAR Manager возвращает неверное значение

Post by kasru » Thu 07 Dec, 2017 22:31

Получаю номер файлового дескриптора с помощью ф-ци _fileno из msvcrt.dll, чтобы в дальнейшем использовать его.
На тестах в IDE ZeroBrane Studio _fileno работает верно, возвращает число в пределах от 3 до 255. а в FAR Manager нет. возвращает 0, большие или отрицательные числа. Подскажите что я делаю не так или как в FAR Manager получить номер файлового дескриптора.
Пример тестового кода ниже.
  1. local ffi = require "ffi"
  2.  
  3. local lib = ffi.C
  4.  
  5. -- https://forum.farmanager. com/viewtopic.php?p=147610#p147610
  6. local function safe_def(def) return pcall(ffi.cdef,def) end
  7.  
  8. safe_def([[
  9.   int _fileno(struct FILE *stream);
  10. ]])
  11.  
  12. local filemain = "testfileno"
  13. local file1 = io.open(filemain.."-1.txt", "wb")
  14. local file2 = io.open(filemain.."-2.txt", "wb")
  15. local fd1 = lib._fileno(file1)
  16. local fd2 = lib._fileno(file2)
  17. --print(fd1)
  18. --print(fd2)
  19. far.Message(fd1)
  20. far.Message(fd2)
  21.  
  22. io.close(file1)
  23. io.close(file2)

User avatar
John Doe
Бюрократ
Posts: 12192
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 31 times
Been thanked: 159 times

[LUA][FFI][msvcrt.dll][_fileno] FAR Manager возвращает неверное значение

Post by John Doe » Thu 07 Dec, 2017 23:11

Пример, запущенный через luajit, печатает 3,4 (стабильно)
Пример, запущенный через lfjit, печатает два больших непоследовательных числа, разными от запуска к запуску.

Shmuel
Posts: 5698
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 21 times
Been thanked: 200 times

[LUA][FFI][msvcrt.dll][_fileno] FAR Manager возвращает неверное значение

Post by Shmuel » Fri 08 Dec, 2017 05:00

Нигде в документации не сказано, что io.open возвращает FILE*. Там сказано "It returns a new file handle", а это не одно и то же. Поэтому, даже если при каких-то обстоятельствах этот код у вас работает, нет гарантии, что при очередном обновлении LuaJIT, например, он не поломается.
Если уж пользуетесь FFI - вызывайте fopen, fclose и т.д., а не io.open.

kasru
Posts: 5
Joined: Wed 28 Mar, 2012 14:07
Has thanked: 2 times

[LUA][FFI][msvcrt.dll][_fileno] FAR Manager возвращает неверное значение

Post by kasru » Fri 08 Dec, 2017 07:29

И всё таки, если io.open - "It returns a new file handle". То вопрос можно задать по другому, как из "file handle" получить FILE* или номер файлового дескриптора, ведь внутри реализации LuaJIT где то LUA должен хранить какой то "file handle" операционной системы.
Может где в исходниках LuaJIT посмотреть или подскажите какой форум разработчиков LuaJIT.

kasru
Posts: 5
Joined: Wed 28 Mar, 2012 14:07
Has thanked: 2 times

[LUA][FFI][msvcrt.dll][_fileno] FAR Manager возвращает неверное значение

Post by kasru » Fri 08 Dec, 2017 07:31

из каких исходиков собирается LuaJIT для Far Manager? т.е. где можно посмотреть на исходики LuaJIT для Far Manager.

User avatar
John Doe
Бюрократ
Posts: 12192
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 31 times
Been thanked: 159 times

[LUA][FFI][msvcrt.dll][_fileno] FAR Manager возвращает неверное значение

Post by John Doe » Fri 08 Dec, 2017 07:52

Shmuel wrote:
Fri 08 Dec, 2017 05:00
Нигде в документации не сказано, что io.open возвращает FILE*.
http://luajit.org/ext_ffi_semantics.htm ... rt_fromlua
Мне казалось, что тут как раз этот случай.

Shmuel
Posts: 5698
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 21 times
Been thanked: 200 times

[LUA][FFI][msvcrt.dll][_fileno] FAR Manager возвращает неверное значение

Post by Shmuel » Fri 08 Dec, 2017 08:00

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.

Shmuel
Posts: 5698
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 21 times
Been thanked: 200 times

[LUA][FFI][msvcrt.dll][_fileno] FAR Manager возвращает неверное значение

Post by Shmuel » Sat 09 Dec, 2017 11:14

kasru, сейчас добавил метод rawhandle, возвращающий FILE*. Будет в следующей ночной сборке.
Пример использования: local fd1 = lib._fileno(file1:rawhandle())

kasru
Posts: 5
Joined: Wed 28 Mar, 2012 14:07
Has thanked: 2 times

[LUA][FFI][msvcrt.dll][_fileno] FAR Manager возвращает неверное значение

Post by kasru » Sat 09 Dec, 2017 20:45

Shmuel wrote:
Sat 09 Dec, 2017 11:14
kasru, сейчас добавил метод rawhandle, возвращающий FILE*. Будет в следующей ночной сборке.
Пример использования: local fd1 = lib._fileno(file1:rawhandle())
Спасибо, а возможно сделать сразу конвертацию в FILE*, без метода rawhandle ?

Shmuel
Posts: 5698
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 21 times
Been thanked: 200 times

[LUA][FFI][msvcrt.dll][_fileno] FAR Manager возвращает неверное значение

Post by Shmuel » Sun 10 Dec, 2017 06:47

kasru wrote:
Sat 09 Dec, 2017 20:45
а возможно сделать сразу конвертацию в FILE*, без метода rawhandle ?
Думаю, что возможно, но я этим заниматься не буду.

Post Reply

Return to “Нужна помощь”