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

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

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

Post 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)
User avatar
John Doe
Бюрократ
Posts: 13861
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 74 times
Been thanked: 428 times
Contact:

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

Post by John Doe »

Пример, запущенный через luajit, печатает 3,4 (стабильно)
Пример, запущенный через lfjit, печатает два больших непоследовательных числа, разными от запуска к запуску.
Shmuel
Posts: 6840
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 530 times

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

Post by Shmuel »

Нигде в документации не сказано, что io.open возвращает FILE*. Там сказано "It returns a new file handle", а это не одно и то же. Поэтому, даже если при каких-то обстоятельствах этот код у вас работает, нет гарантии, что при очередном обновлении LuaJIT, например, он не поломается.
Если уж пользуетесь FFI - вызывайте fopen, fclose и т.д., а не io.open.
kasru
Posts: 6
Joined: Wed 28 Mar, 2012 14:07
Has thanked: 3 times

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

Post by kasru »

И всё таки, если io.open - "It returns a new file handle". То вопрос можно задать по другому, как из "file handle" получить FILE* или номер файлового дескриптора, ведь внутри реализации LuaJIT где то LUA должен хранить какой то "file handle" операционной системы.
Может где в исходниках LuaJIT посмотреть или подскажите какой форум разработчиков LuaJIT.
kasru
Posts: 6
Joined: Wed 28 Mar, 2012 14:07
Has thanked: 3 times

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

Post by kasru »

из каких исходиков собирается LuaJIT для Far Manager? т.е. где можно посмотреть на исходики LuaJIT для Far Manager.
User avatar
John Doe
Бюрократ
Posts: 13861
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 74 times
Been thanked: 428 times
Contact:

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

Post by John Doe »

Shmuel wrote: Fri 08 Dec, 2017 05:00Нигде в документации не сказано, что io.open возвращает FILE*.
http://luajit.org/ext_ffi_semantics.htm ... rt_fromlua
Мне казалось, что тут как раз этот случай.
Shmuel
Posts: 6840
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 530 times

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

Post 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.
Shmuel
Posts: 6840
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 530 times

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

Post by Shmuel »

kasru, сейчас добавил метод rawhandle, возвращающий FILE*. Будет в следующей ночной сборке.
Пример использования: local fd1 = lib._fileno(file1:rawhandle())
kasru
Posts: 6
Joined: Wed 28 Mar, 2012 14:07
Has thanked: 3 times

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

Post by kasru »

Shmuel wrote: Sat 09 Dec, 2017 11:14kasru, сейчас добавил метод rawhandle, возвращающий FILE*. Будет в следующей ночной сборке.
Пример использования: local fd1 = lib._fileno(file1:rawhandle())
Спасибо, а возможно сделать сразу конвертацию в FILE*, без метода rawhandle ?
Shmuel
Posts: 6840
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 530 times

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

Post by Shmuel »

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

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