LINUX.ORG.RU

Как использовать файлы в /var/lock ?

 , , ,


0

2

Прочитал это http://rus-linux.net/MyLDP/file-sys/fhs-2.2-rus/fhs-5.9.html

Но вопросы остались. А именно как сами программы определяют что lock файл занят и как они его освобождают в случае аварийного завершения? Как это вообще работает?

Проверяешь, есть ли lock файл.

Если нет быстренько создаёшь свой и пишешь свой PID.

Если есть читаешь из него pid и проверяешь есть ли такой процесс. Если нет пишешь свой pid.

Если чужой pid всё-таки есть вываливаешься с криками «что вы мне подсовываете занятый ресурс!!11 А?»

Наверняка есть метод, делающий это всё атомарно.

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

Ясно.. а я то думал...

Я ради интереса делаю что то вроде шины, приложение должно читать данные из одного pipe и посылать его во множество других, то есть делать широковещательную рассылку. Но проблема в том что если одновременно 2 приложения пошлют в pipe строку, то 2 строки смешаются. И сигнал не будет правильно передан. Я хочу сделать так что бы каждое приложение на время ввода строки могло монополизировать поток.

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

Проверяешь, есть ли lock файл.

Я, кстати, неоднократно встречал утверждения, что это одно из самых больших уродств в Unix. Почему?

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

Я, кстати, неоднократно встречал утверждения, что это одно из самых больших уродств в Unix. Почему?

Потому что pid-ы не уникальны и могут повторяться.

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

Если нет быстренько создаёшь свой и пишешь свой PID.

Если есть читаешь из него pid и проверяешь есть ли такой процесс. Если нет пишешь свой pid.

Не «быстренько пишешь свой pid», а создаешь временный файл со своим pid-ом и переименовываешь его в нужный lock-файл. Операция переименования атомарна.

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

имхо еще из-за неатомарности

но там же есть какая-то linux-специфичная опция открытия файла, так что если программа вылетит, то файл исчезнет. При запуске второго экземпляра приложения, уже открытый с этим флагом файл переоткрыть нельзя. То есть можно считать, что операции с локом вполне атомарны (гарантируется ведром линукса)

а кто захавал файл можно получить через lsof/fuser, необязательно писать в него пид

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

Если строки меньше PIPE_BUF (4096 байт в linux), то запись атомарна.

В случае длинных строк с такой блокировкой производительность будет очень низкая, лучше разбивай строку на куски меньше PIPE_BUF, добавляй заголовок, в котором в том числе будет и pid отправителя и пиши их в пайп в один заход. Таким образом приемник может собрать целую строку, даже если несколько процессов пишет в один и тот же пайп одновременно.

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

То есть если строка всего в 4 килобайта то можно не заморачиваться? Радует. Мне надо просто пересылать сообщения:

service daemon-e started
service daemon-e stoped
service daemon-e reload-conf
system status reboot
meta-system-status base-system start
rezedent12 ☆☆☆
() автор топика

А почему в треде нема отсылок к fcntl FD_SETLK? Не модно что ль.

anonymous
()
Ответ на: комментарий от rezedent12

если одновременно 2 приложения пошлют в pipe строку, то 2 строки смешаются.

если строки меньше 64К, то не смешаются. А если больше, то что-ты ты не так делаешь…

Я хочу сделать так что бы каждое приложение на время ввода строки могло монополизировать поток.

дык смотри, кто файл открывает. Если файл кто-то уже открыл, жди, пока закроют. Файл сам по себе может работать семафором.

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

Да, можно не заморачиваться. Почитай pipe(7), раздел PIPE_BUF.

nowhere
()

О как интересно. Только собирался задать похожий вопрос... Пошёл по ссылкам гуглить.

Xellos ★★★★★
()
5 августа 2014 г.
Ответ на: комментарий от rezedent12

Можно еще немного вас поспрашивать? Вы пересмотрели архитектуру (принцип) совместного использования ресурсов или вообще больше не пишете в этом плане (т.е. тема просто закрыта и все)?

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

Вы пересмотрели архитектуру (принцип) совместного использования ресурсов или вообще больше не пишете в этом плане (т.е. тема просто закрыта и все)?

Я пришёл к выводу что это должен быть механизм на уровне ядра операционной системы. Каждый процесс запросивший заблокированный ресурс должен получать соответствующий сигнал при его разблокировании. То есть основной алгоритм должен прерываться и управление должно быть передано в нужную функцию. Тогда только работа этого механизма будет по настоящему быстрой. Конечно на прикладном уровне этом можно реализовать при помощи управления потоками, но на уровне операционной системы, даже общие страницы памяти будут не самым быстрым механизмом. Вполне возможно что всё о чём я написал уже реализовано, но я отошёл от этой темы, потому что системное программирование меня не интересует.

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

Благодарю! Полностью с Вами согласен. Спасибо за отклик!

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