#include <unistd.h>
#include <stdlib.h>
#include <fcntl.h>
#include <syslog.h>
#include <string.h>
#include <errno.h>
#include <stdio.h>
#include <sys/stat.h>
#define LOCKFILE "/var/run/daemon.pid"
#define LOCKMODE (S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH)
extern int lockfile(int);
int
already_running(void)
{
int fd;
char buf[16];
fd = open(LOCKFILE, O_RDWR|O_CREAT, LOCKMODE);
if (fd < 0) {
syslog(LOG_ERR, "can't open %s: %s", LOCKFILE, strerror(errno));
exit(1);
}
if (lockfile(fd) < 0) {
if (errno == EACCES || errno == EAGAIN) {
close(fd);
return(1);
}
syslog(LOG_ERR, "can't lock %s: %s", LOCKFILE, strerror(errno));
exit(1);
}
ftruncate(fd, 0);
sprintf(buf, "%ld", (long)getpid());
write(fd, buf, strlen(buf)+1);
return(0);
}
apue_使用文件和记录锁来保证只运行一个守护进程的一个副本
最新推荐文章于 2025-12-02 18:02:47 发布
这段代码实现了一个功能,检查并创建一个PID文件来确保只有一个进程正在运行。它打开指定的锁定文件,尝试获取锁,如果失败(可能是由于权限问题或文件已被其他进程锁定),则记录错误日志并退出。成功获取锁后,写入当前进程ID到文件中。
230

被折叠的 条评论
为什么被折叠?



