LINUX.ORG.RU

2 программы и файл


0

0

Вопрос, есть две программы(на С++, ось линукс) А и Б, и файл С. А переодически перезаписывает файл С, программа Б так-же переодически читает его. Исходники А отсутствуют. А вот вопрос, реально ли в Б селать так, чтобы можно было-бы знать пишется -ли в текуший момент что в файл С? Ну чтобы избежать чтения недоконца дописаных данных. Ну первое что приходит на ум, это перед чтением, чтобы Б выставляла режим только чтение у файла, тогда А не сможет перезаписать его, но опятьже неподходит...

Ну если оно периодически его открывает/закрывает то fuser поможет тебе определить открыт счас файл или нет и кем.

imp ★★
()

куча способов. Хоть через lsof, хоть через procfs. Не так давно узнал новое слово- systemtap :). Можно враппер на open сделать через LDPRELOAD. Можно расположить файл на fuse(самопальной) которая бы уведомляла при попытке доступа к файлу, можно смотреть дату модификации, если она постоянно меняется значит в файл пишется(это проверить надо), можно расположить файл на сетевой фс и снифером смотреть когда сетевая активность будет(это для извращенцев), можно юзать inotify(рекомендую)...

true_admin ★★★★★
()
Ответ на: комментарий от true_admin

по поводу файла, этот файл находится в /sys/devices/pci0000:00/0000:00:18.3/temp1_input иными словами какой-то модуль ядра пишет в него температуру с проца(типа мониторю ее я) так вот причина вопроса: при высокой нагрузке (тачка отднопроцесорная, проц 2,4 Ггц) (запуск несколькольких бесконечных потоков с запьсью/чтения диска, через fork --- с целью нагрузки системы, и анализа че как греетсо) непонятное явление -- типа присутствую скачки (коротковременные менее секунды, но частые пару раз в минуту(при нагрузке), причем без нагрузке тачки скачки ооочень редки 1-2 в день ) в температре (т.е та цифра что в файле лежит) причем температура стабльно держится 40-50 (при ммакс нагрузке), потом по непонятной причине на менее чем секунду подскакивает до 78 (скорость вентиялтора не меняется), так вот я думаю, может причина в том что я читаю недоконца дописанный файл? Хотя опятьже, окуда 78?, если тама число (допустим) 1234, тонаверное (к примеру если надо записать допустим 3333) вначале будет 3234, потом 3334, 3334 и 3333 или я что путаю?

hello_world
() автор топика
Ответ на: комментарий от hello_world

эээ, юзай lmsensors. Это псевдофайл, там атомарно ведётся "запись". Скорее всего, это баг или драйвера или датчика.

true_admin ★★★★★
()

wrapper через ldpreload (как посоветовали выше) самый прямой и простой способ имхо.

прям в open/close блокировки вставить.

sergej ★★★★★
()
Ответ на: комментарий от sergej

Хотел посоветовать man 2 flock, но не знаю, удобно ли это при доступе из модуля. Еще как вариане - читать 2 раза подряд, проводить sanity check.

ratatosk
()
Ответ на: комментарий от hello_world

>модуль ядра

>есть две программы(на С++, ось линукс)

Модуль ядра на C++?

По поводу sysfs, она виртуальная, то есть нету блочного устройства, на котором хранятся её данные. Каждый раз когда вы делаете read() из данной ФС происходит обращение к ядру и модуль передает свои данные в ответ. То есть модуль не пишет в файл.

Я не знаю, как вы читаете из этого файла. Могу посоветовать попробовать использовать системный вызов read(), вместо потокового чтения. Хотя, наверное, действительно просто ошибка в драйвере.

P.S. Можете почитать про Метрологию, 78 --- это выбросы, которые отсеиваются, например, по правилу трёх сигм.

mky ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.