mva
у меня тут вот встал вопрос ребром
mva
хочу читать псевдо-файлики в sysfs в которых постоянно изменяются значения
mva
но не хочу постоянно закрывать-открывать файловые дескрипторы (дорого, однако)
mva
однако без этого lua постоянно читает один и тот же контент
mva
(в то время, как питоновый аналог читает реальные данные)
Snusmumriken
Seek?
Snusmumriken
Хе, seek + flush. Питон просто "автоматически" очищает буферы.
mva
хм... а я ведь думал про flush
mva
но что-то почитав доки разочаровался что он только для write
mva
а оно, оказывается и для read помогает
mva
спасибо @Snusmumriken
Snusmumriken
Сам не знал что работает при чтении. Эксперименты.
Anonymous
(присоединяюсь к спасибке)
mva
интересное наблюдение
mva
с /proc/stat этот фокус работает
mva
а вот с тем что нужно мне - нет :(
mva
(в моём случае это /sys/bus/iio/devices/iio:device1/in_accel_x_raw )
mva
(ну и две соседние ноды для осей y и z)
mva
и я заметил в выводе stat что у /proc/stat size=0
mva
а у этих вот в sysfs - 4096
mva
хм... вообще чудеса
mva
я уже даже open/close перенёс внутрь цикла
mva
и всё равно данные не изменяются О_о
mva
хех... а всё ещё интереснее
Snusmumriken
Хмм. Значит чот не то. Или оно выдаёт поток значений, как random.
mva
пока запущен lua-скрипт с этим циклом (даже с open-close внутри него), то даже cat по этому файлу выдаёт то же значение что видит lua
Snusmumriken
Ты там себе джойстик из проводочков мутишь? : )
mva
но стоит прибить lua-скрипт - cat снова начинает получать разные значения при каждом вызове
mva
Ты там себе джойстик из проводочков мутишь? : )
типа того (на самом деле, хочу переделать набор скриптов для синкпада-йоги (трансформера в планшет) с питона на Lua
mva
в частности - сейчас речь о скрипте для поворота экрана в зависимости от положения в пространстве
Snusmumriken
А если чот такое? local sleep = require'socket'.sleep while true do local f = io.open(...) print(f:read('*a')) f:close() sleep(1) end
Snusmumriken
Ну типа мало ли, демон этой фиговины смотрит, не открыт ли "файл" в чём-то (я хз как это сделать в линуксе, кстати), и если не открыт - пишет туда. А ты своими бесконечными циклами непрерывно открываешь-закрываешь. Хотя в целом, если оно работает не параллельно, должно быть пофигу.
mva
что интересно, сокетовый sleep(1) помог
mva
(ещё раз спасибо, @Snusmumriken )
mva
но... WTF?!?!!?
Snusmumriken
Я уже описал, что если процесс идёт прям супер-параллельно, то процесс с не-su-правами теоретически может внезапно перестать писать в открытый где-то файлик (виртуальный?).
Snusmumriken
А sleep как бы даёт ему время на свои дела.
Snusmumriken
Кстати, seek + flush + sleep работает?
mva
Кстати, seek + flush + sleep работает?
проверю чуток попозже (пока на оффлайн-дела отвлекли).
mva
и, видимо, писан он черех жопу
Snusmumriken
Может быть : )
Snusmumriken
В целом, если писать несколькими луёвыми скриптами в один и тот же файл большими блоками, то блоки могут быть перемешаны. То есть, друг другу они как бы не мешают, но один блок может влезать в другой (в зависимости от внутреннего размера буфера и их пересечений).
Snusmumriken
Я так кучу логов пробовал писать, из разных процессов в одну сточную канаву. Закончилось плохо )) Ну, или надо вызывать flush после каждой попытки записи.
Snusmumriken
И да, когда будешь тестить flush + sleep, попробуй дёргать сразу два flush'а, перед sleep'ом и после. На всяк случ.
mva
@Snusmumriken а ты сходу не помнишь, есть где-нибудь в не-экзотических либах usleep?
Snusmumriken
Если ты гоняешь luajit, то там встроен ))
mva
(хочу не секунду спать, а несколько миллисекунд)
mva
как-то я упустил это (или напрочь забыл)
Snusmumriken
Ой, вбивай 0.01 в luasocket.sleep
Snusmumriken
Оно тянет дробные до третьего знака после запятой.
mva
а, ну ок
Snusmumriken
Там, грубо говоря, функция sleep выглядит как Sleep(lua_number * 1000); или poll(... , lua_number * 1000);
Snusmumriken
А у luajit sleep встроен через http://luajit.org/ext_ffi_tutorial.html
mva
но да, можно затянуть
Snusmumriken
Хехехе, ну, тянуть экзотические либы не нужно - значит как бы встроен ))
mva
и, наверное, так будет даже лучше, чтоб от сокета зависимость не тащить
Snusmumriken
Эх, читы. С одной стороны - пики точены: зависимость от кроссплатформенной но обязательно тащибельной luasocket. С другой стороны - ffi, который работает только у luajit (или у alien, которую тоже надо тащить).
mva
получилось как-то так
mva
(гадской jpeg-сжатие в гребучих шакалов в телеграме портит цвета моего скриншота)
mva
вот зачем png пережимать в jpg, блдж?
Snusmumriken
Тебе под линекс, кстати, поэтому из sleep'а можно вытащить вендо-специфичную фигню.
mva
ну, вообще, да, если так подумать, то на венде это есть и без моей поделки, так что нинужно, да :)
Snusmumriken
И да, кстати, flush + sleep пашет?
mva
правда, stdout тоже флашить пришлось
Snusmumriken
mva
иначе тупило по секунде
Snusmumriken
Костыльное программирование!
Mikhail
эх... не было времени с луа рести подружиться. пришлось тоже костыльное программирование фулл стека мутить (((
Mikhail
я и на рести костыльное программирование фулл-стека мучу
я завишу от многих библиотек подключаемых. и даже баги вв них нахожу.. это удручает. хорошо иметь все свое. но так не бывает. сплошное изобретение колеса выходило бы.
Mikhail
как раз костыли со sleep - подобными вещами. когда нужен доступ к порту сразу нескольким пользователям, доступ в терминал и прочее... и все параллельно
Snusmumriken
я и на рести костыльное программирование фулл-стека мучу
Правда, я бы оформил во что-то чуть более ООПшное: local accel = {} accel.sleep = require'socket'.sleep -- или любой другой accel.root = '/sys/bus/iio/devices/iio:device1' function accel:init() local fscale = io.open(self.root .. '/in_accel_scale') self.scale = fscale:read('*n'); fscale:close() self.io = { io.open(self.root .. '/in_accell_x_raw'), io.open(self.root .. '/in_accell_y_raw'), io.open(self.root .. '/in_accell_z_raw'), } self.inited = true return self end function accel:read() if not self.inited then self:init() end self.sleep(0.08) -- задержка перед чтением, да local res = {} for i, fhnd in ipairs(self.io) do fhnd:seek('set', 0) res[#res + 1] = fhnd:read('*n') * self.scale fhnd:flush() end return unpack(res) end
Snusmumriken
For great justice. Чтобы был "инкапсулированный" девайс, который можно подключать тудой-сюдой.
mva
> fhnd:seek('set', 0)
mva
0 жи ж дефолт
mva
и маловероятно что поменяется в новых ABI ;)