Листинг 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\n", (long) getpid());
20 Ftruncate(pidfd, 0);
21 Write(pidfd, line, strlen(line));
22 /* основной текст программы демона… */
23 pause();
24 }