Книга: UNIX: взаимодействие процессов
9.7. Запуск единственного экземпляра демона
Разделы на этой странице:
9.7. Запуск единственного экземпляра демона
Часто блокировки записей используются для обеспечения работы какой-либо пpoгрaммы (например, демона) в единственном экземпляре. Фрагмент кода, приведенный в листинге 9.8, должен выполняться при запуске демона.
Листинг 9.8. Гарантия выполнения единственного экземпляра программы
//lock/onedaemon.c
1 #include "unpipc.h"
2 #define PATH_PIDFILE "pidfile"
3 int
4 main(int argc, char **argv)
5 {
6 int pidfd;
7 char line[MAXLINE];
8 /* открытие или создание файла с идентификатором процесса */
9 pidfd = Open(PATH_PIDFILE, O_RDWR | O_CREAT, FILE_MODE);
10 /* попытка блокирования всего файла на запись */
11 if (write_lock(pidfd, 0, SEEK_SET, 0) < 0) {
12 if (errno == EACCES || errno == EAGAIN)
13 err_quit("unable to lock %s, is %s already running?",
14 PATH_PIDFILE, argv[0]);
15 else
16 err_sys("unable to lock %s", PATH_PIDFILE):
17 }
18 /* запись идентификатора: файл остается открытым, чтобы он был заблокирован */
19 snprintf(line, sizeof(line), "%ldn", (long) getpid());
20 Ftruncate(pidfd, 0);
21 Write(pidfd, line, strlen(line));
22 /* основной текст программы демона… */
23 pause();
24 }
Открытие и блокирование файла
8-17 Демон создает однострочный файл, в который записывает свой идентификатор процесса. Этот файл открывается или создается, а затем делается попытка Заблокировать его на запись целиком. Если блокировку установить не удается, мы понимаем, что один экземпляр демона уже запущен, поэтому выводится сообщение об ошибке и программа завершает работу.
ПРИМЕЧАНИЕ
Во многих версиях Unix демоны записывают свои идентификаторы в файл. Solaris 2.6 хранит подобные файлы в каталоге /etc, a Digital Unix 4.0B и BSD/OS — в каталоге /var/run.
Запись идентификатора процесса в файл
18-21 Мы укорачиваем файл до 0 байт, а затем записываем в него строку с нашим идентификатором. Причина, по которой нужно укорачивать файл, заключается в том, что у предыдущего экземпляра демона идентификатор мог быть представлен более длинным числом, чем у данного, поэтому в результате в файле может образоваться смесь двух идентификаторов.
Вот результат работы программы из листинга 9.8:
solaris % onedaemon& запускаем первый экземпляр
[1] 22388
solaris % cat pidfile проверяем идентификатор
22388
solaris % onedaemon пытаемся запустить второй экземпляр
unable to lock pidfile, is onedaemon already running?
Существуют и другие способы предотвращения запуска нескольких экземпляров демонов, например семафоры. Преимущество данного метода в том, что многим демонам и так приходится записывать в файл свои идентификаторы, а при досрочном завершении работы демона блокировка с файла снимается автоматически.
- 9.1. Введение
- 9.2. Блокирование записей и файлов
- 9.3. Блокирование записей с помощью fcntl по стандарту Posix
- 9.4. Рекомендательная блокировка
- 9.5. Обязательная блокировка
- 9.6. Приоритет чтения и записи
- 9.7. Запуск единственного экземпляра демона
- 9.8. Блокирование файлов
- 9.9. Блокирование в NFS
- 9.10. Резюме
- Упражнения
- Запуск InterBase-сервера
- Практическая работа 53. Запуск Access. Работа с объектами базы данных
- Одновременный запуск нескольких копий сервера (multi-instancing)
- Запуск Access. Открытие учебной базы данных Борей
- Способы «запуска» слухов
- Запуск сценариев на удаленных машинах. Контроль за ходом выполнения таких сценариев
- Как ускорить запуск программ?
- Перемещать файлы удобнее, если запустить два экземпляра Проводника и разместить их окна бок о бок. Можно ли это делать а...
- Как сделать, чтобы при запуске Windows автоматически открывались папки, с которыми я работал в прошлый раз?
- Могу ли я изменить или отключить звуки, которые проигрываются при запуске Windows, щелчке кнопкой мыши на папке и т. д.?
- Я случайно удалил ярлык Свернуть все окна с панели быстрого запуска. Как вернуть его обратно?
- На Панели быстрого запуска возле кнопки меню Пуск вмещается всего три значка. Как увеличить ее емкость?