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?

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

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

3.3. Жизненный цикл экземпляра программы и «общая стоимость владения» им

Из книги Перспективы свободного программного обеспечения в сфере государственного управления и бюджетном секторе автора Отставнов Максим

3.3. Жизненный цикл экземпляра программы и «общая стоимость владения» им Жизненный цикл отдельного экземпляра программы, находящегося в эксплуатации, вообще говоря, не совпадает с жизненным циклом самой программы как произведения5.В простейшем, вырожденном случае


11.1.2. Создание атрибутов экземпляра

Из книги Программирование на языке Ruby [Идеология языка, теория и практика применения] автора Фултон Хэл

11.1.2. Создание атрибутов экземпляра Имени атрибута экземпляра в Ruby всегда предшествует знак @. Это обычная переменная в том смысле, что она начинает существовать после первого присваивания.В ОО-языках часто создаются методы для доступа к атрибутам, чтобы обеспечить


11.3.3. Динамическое создание экземпляра класса, заданного своим именем

Из книги HTML 5, CSS 3 и Web 2.0. Разработка современных Web-сайтов. автора Дронов Владимир

11.3.3. Динамическое создание экземпляра класса, заданного своим именем Такой вопрос мы видели многократно. Пусть дана строка, содержащая имя класса; как можно создать экземпляр этого класса?Правильный способ — воспользоваться методом const_get, который мы только что


11.3.4. Получение и установка переменных экземпляра

Из книги HTML 5, CSS 3 и Web 2.0. Разработка современных Web-сайтов автора Дронов Владимир

11.3.4. Получение и установка переменных экземпляра Отвечая на пожелание употреблять eval как можно реже, в Ruby теперь включены методы, которые могут получить или присвоить новое значение переменной экземпляра, имя которой задано в виде строки:class MyClass attr_reader :alpha, :beta def


Понятия объекта и экземпляра объекта

Из книги Разработка приложений в среде Linux. Второе издание автора Джонсон Майкл К.

Понятия объекта и экземпляра объекта В начале этой главы мы познакомились с типами данных, определяющими саму природу данных и набор действий, которые можно выполнять с этими данными. Так, строковый тип определяет, что данные этого типа представляют собой строки —


Получение экземпляра объекта

Из книги C++. Сборник рецептов автора Диггинс Кристофер

Получение экземпляра объекта Но как нам получить экземпляр нужного объекта?— Экземпляры многих объектов создаются самим языком JavaScript, Web-обозревателем или библиотеками сторонних разработчиков.— Экземпляры некоторых объектов возвращаются функциями или методами


Свойства и методы экземпляра объекта

Из книги Macromedia Flash Professional 8. Графика и анимация автора Дронов В. А.

Свойства и методы экземпляра объекта Как мы уже знаем, объект определяет набор свойств и методов, которые затем станут "собственностью" всех его экземпляров. Иными словами, экземпляр объекта получит все свойства и методы, что объявлены в объекте, на основе которого он


Понятия объекта и экземпляра объекта

Из книги Флибуста. Обратная сторона [Инструкции по установке и запуску i2p, TOR и VPN для «чайников». v. 1.1] автора Коллектив авторов

Понятия объекта и экземпляра объекта В начале этой главы мы познакомились с типами данных, определяющими саму природу данных и набор действий, которые можно выполнять с этими данными. Так, строковый тип определяет, что данные этого типа представляют собой строки —


Получение экземпляра объекта

Из книги UNIX: разработка сетевых приложений автора Стивенс Уильям Ричард

Получение экземпляра объекта Но как нам получить экземпляр нужного объекта?— Экземпляры многих объектов создаются самим языком JavaScript, Web-обозревателем или библиотеками сторонних разработчиков.— Экземпляры некоторых объектов возвращаются функциями или методами


Свойства и методы экземпляра объекта

Из книги автора

Свойства и методы экземпляра объекта Как мы уже знаем, объект определяет набор свойств и методов, которые затем станут "собственностью" всех его экземпляров. Иными словами, экземпляр объекта получит все свойства и методы, что объявлены в объекте, на основе которого он


22.4. Запуск в качестве демона

Из книги автора

22.4. Запуск в качестве демона При разработке программ, создаваемых для работы в качестве системных демонов, нужно очень внимательно проводить их становление как демонов для правильного определения всех деталей. Ниже приведен перечень тех обстоятельств, на которые


2.2. Обеспечение единственности экземпляра переменной при большом количестве исходных файлов

Из книги автора

2.2. Обеспечение единственности экземпляра переменной при большом количестве исходных файлов ПроблемаТребуется, чтобы одна и та же переменная использовалась различными модулями программы, а копия переменной должна быть только одна. Другими словами, это должна быть


Понятия объекта и экземпляра

Из книги автора

Понятия объекта и экземпляра Объект — это сложный тип данных, включающий в себя множество переменных — свойств — и набор функций для манипулирования значениями этих переменных — методов. Здесь все достаточно просто: свойства хранят некие данные, а методы их


2. Запуск

Из книги автора

2. Запуск 2.1.После завершения распаковки архива, в выбранной папке (в моем случае TOR) связка распакуется в директорию C: PRIVATПРОГРАММЫTORTor Browser Рис. 11 Рис. 11Переходим в нее (1)Можно сразу запустить исполняемый файл Start Tor Browser.exe (2), но лучше создать ярлычок для


4. Запуск i2P

Из книги автора

4. Запуск i2P Запускаем ярлык-«человечка» Start i2p (no window) (1)над треем появится серый прямоугольник (2) Рис. 78В адресной строке браузера набираем http://127.0.0.1:7657/console Рис. 79Когда вы запустите i2p у вас некоторое время не будет локальных туннелей Рис. 80Затем появится надпись «Не


Пример: сервер времени и даты в качестве демона

Из книги автора

Пример: сервер времени и даты в качестве демона В листинге 13.2 представлено изменение нашего сервера времени и даты, не зависящего от протокола. В отличие от сервера, показанного в листинге 11.8, в нем вызывается функция daemon_init, чтобы этот сервер мог выполняться в качестве