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), "%ld ", (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?

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

Данный текст является ознакомительным фрагментом.