Посоны, есть один файл… Он постоянно меняется, а я хочу его анализировать каждые N секунд. Он, конечно, небольшой — меньше десятка метров — и можно его просто копировать, но мне хочется consistency и isolation в терминах ACID: у меня должна быть возможность взять какое-то конкретное состояние файла и читать его сколько влезет, не опасаясь того, что кто-то мне эти данные перепишет. Так можно? В open(2) ничего такого не нашёл. ФС, если что, ext4, но по возможности хотелось бы не привязываться.
@minoru нужна внешняя синхронизация
а в файл данные пишутся или перезаписываются?
@minoru напиши драйверок для ядра, который бы вывешивал файлик.
и реализуй какой-нить ioctl, который будет вызывать блокировку write пока ты эту блокировку сам явно не снимешь.
ну и mmap/munmap заодно имплементни чтобы читать из буфера как белый человек.
кандидат в номинации «наркоманы ебаные»: что насчёл LD_PRELOAD на пишущей стороне, который будет делать flock при вызове write?
@minoru да не, там обычный char device хватит со стандартным набором fops, не так сложно на самом деле
@minoru если есть сорец, что мешает пропатчить с тем чтобы был flock? или сделать перезаписывание файла, чтобы inode новая создавалась, т.е. открыв файл из другой программы ты всегда будешь получать консистентное состояние
@minoru номинация обязывает
@anonymous тем-то инженер и отличается от анонимуса: предлагает решения вместо того чтобы пытаться всем в рот нассать
@minoru чо за программка?
@minoru давай уже ссылку на исходники
@anonymous не бывает «костыльных» и «некостыльных» решений. есть решения «работающие» и твои (нассать в ротешник)
@anonymous Ок, давайте тогда поговорим об архитектуре.
Есть Firefox, есть arbtt (тайм-трекер для нищебродов и паранойиков, не желающих платить RescueTime за то, что они тырят твои данные и рисуют для тебя ГРАФИЧКИ). Но последняя не умеет читать адрес, открытый в текущей вкладке первого (а RescueTime умеет!).
Firefox пишет в ~/.mozilla/firefox/%PROFILE%/sessionstore.js список всех-всех-всех открытых табов вместе со всякой инфой, в том числе открытым во вкладке адресом.
arbtt работает по внутреннему таймеру; я, например, попросил его собирать статистику каждые десять секунд. Хотелось бы научить его читать файлик и вытягивать оттуда домены, но возникают проблемы с тем, что Firefox может успеть всё переписать, пока мы читаем. Отсюда и пост.
@minoru а чего ты паришься? берёшь да вычитываешь весь файл в память — он несколько килобайт весит. после этого парсишь, смог распарсить — норм. не смог — значит огнелис что-то записал пока ты читал и нужно сделать ретрай. количество false positives будет пренебрежимо мало
@hirthwork вариант с кастомным драйвером меня больше возбуждает
@4da тебе лишь бы с ПО поебаться, содомит
@minoru напиши экстеншен для прыщфекса, который будет писать в файлик
window.top.getBrowser().selectedBrowser.contentWindow.location.href;
@minoru я, конечно, не настоящий куркума, но из browser/components/sessionstore/src/SessionWorker.js и https://developer.mozilla.org/en-US/docs/Mozilla/JavaScript_code_modules/OSFile.jsm/OS.File_for_the_main_thread#OS.File.writeAtomic() могу сделать вывод, что там всё на mv, т.е. если ты сделал open на файле, то можешь делать read не опасаясь того что данные изменятся, у тебя будет висящая ссылка на удалённый файл, если что
@minoru у меня 15 экстеншенов открыто, думаешь один мелкий погоду сыграет?
олсо нахер его перечитывать в бизилупе? считал раз в 10 секунд и норм.
ну и олсо можно в файлике счетчик завести чтобы оно не обновляло статы если он не инкрементнулся.