Разрешить запуск только одной копии программы в Linux - PullRequest
4 голосов
/ 23 ноября 2010

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

# program &
[1] 12586
# program &
Program is already running

Лучшая идея для меня - создавать .lock-файлы. Но я не нашел никаких линий гильдии о них.

Спасибо.

Ответы [ 2 ]

3 голосов
/ 23 ноября 2010

Один демон, который я написал, открыл сокет домена UNIX для регулярного взаимодействия клиент-демон.Затем другие экземпляры проверяли, могут ли они подключиться к этому сокету.Если они могли, другой экземпляр в настоящее время работает. Редактировать: Как отмечает @psmears, есть условие гонки.Другие экземпляры должны просто попытаться создать тот же сокет прослушивания.Это не удастся, если он уже используется.

Блокировка файлов работает чаще, чем этот особый случай.Вы можете создать (пустой) файл в хорошо известном месте, а затем использовать блокировки файлов, например, с помощью fcntl(2) и F_SETLK и F_GETLK, чтобы установить блокировку для этого файла или определить, удерживается ли блокировка.Может не работать над NFS.Блокировки очищаются, когда ваш процесс умирает, поэтому это должно работать и переносимо (по крайней мере, для HP-UX).Некоторые демоны любят выгружать свой pid в этот файл, если они решают, что в данный момент не запущен ни один другой экземпляр.

1 голос
/ 23 ноября 2010

Вы можете использовать именованные семпахоры, что является очень стандартным подходом к этой проблеме.Ваша программа вызывает semctl (), чтобы определить, есть ли какие-либо активные семпахоры, а затем проверяет, можно ли запустить.Если вы не найдете ни одного, тогда вы создадите sempahore.

ОС решает проблему с процессами, которые прерываются с помощью kill -9 и покидают sempahores.Вам нужно прочитать справочную страницу для semctl и sem_open для ваших машин, чтобы увидеть, что это за механизм.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...