Книга: 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?

Существуют и другие способы предотвращения запуска нескольких экземпляров демонов, например семафоры. Преимущество данного метода в том, что многим демонам и так приходится записывать в файл свои идентификаторы, а при досрочном завершении работы демона блокировка с файла снимается автоматически.

Оглавление книги


Генерация: 0.591. Запросов К БД/Cache: 3 / 1
поделиться
Вверх Вниз