Стандартный метод блокировки файла использует такие параметры, как O_EXCL
при вызове open()
, чтобы попытаться создать файл. Вы сохраняете PID процесса, используя блокировку, чтобы вы могли определить, существует ли процесс еще (используя kill()
для тестирования). Вам нужно беспокоиться о параллелизме - очень много.
Шаги:
- Определить имя файла блокировки на основе имени FIFO
- Открыть файл блокировки, если он существует
- Проверить, существует ли процесс, использующий его
- Если существует другой процесс, он имеет управление (выход с ошибкой или ожидание выхода)
- Если другой процесс отсутствует, удалить файл блокировки
- На данный момент файл блокировки не существовал при последней проверке.
- Попробуйте создать его с помощью
open()
и O_EXCL
среди других опций.
- Если это работает, ваш процесс создал файл - у вас есть разрешение на это.
- Запишите свой PID в файл; закройте его.
- Откройте FIFO - используйте его.
- Когда закончите (
atexit()
?), Удалите файл блокировки.
Беспокоитесь о том, что произойдет, если вы откроете файл блокировки и не прочитаете PID ... это то, что другой процесс только что создал его и еще не записал в него свой PID, или он умер перед этим? Вероятно, лучше всего отступить - закройте файл и повторите попытку (возможно, после рандомизированного nanosleep()
). Если вы получили пустой файл несколько раз (скажем, 3 подряд), предположите, что процесс мертв, и удалите файл блокировки.
Вы могли бы рассмотреть вопрос о том, чтобы процесс, которому принадлежит файл, поддерживал рекомендательную блокировку файла, пока у него открыт FIFO. Если блокировка отсутствует, процесс умер. Между открытием файла и применением блокировки по-прежнему существует окно уязвимости TOCTOU (время проверки, время использования).
Внимательно посмотрите на справочную страницу open()
в вашей системе, чтобы узнать, есть ли другие варианты, которые могут вам помочь. Иногда процессы используют каталоги (mkdir()
) вместо файлов, потому что даже root не может создать второй экземпляр с заданным именем каталога, но у вас возникают проблемы с тем, как узнать PID процесса с открытым ресурсом и т. Д.