FreeBsd的PID库使用说明

pidfile_open打开一个文件,例如/var/run/httpd.pid,然后使用flock锁住这个文件。
如果锁文件失败,说明有同样的进程正在跑,那么从该文件中把pid读出来,并返回。
这个函数可以在fork之前调用。
pidfile_write函数把pid写入到刚才打开的pid文件中。
pidfile_close关闭刚才打开的pid文件,应该在fork开始一个子进程之后调用。
pidfile_remove删除pid文件
示例代码:

struct pidfh *pfh;
pid_t otherpid, childpid;

pfh = pidfile_open("/var/run/daemon.pid", 0600, &otherpid);
if (pfh == NULL) {
    if (errno == EEXIST)
        errx(EXIT_FAILURE, "Daemon already running, pid: %d.", otherpid);
    /* If we cannot create pidfile from other reasons, only warn. */
    warn("Cannot open or create pidfile");
}

if (daemon(0, 0) == -1) {
    warn("Cannot daemonize");
    pidfile_remove(pfh);
    exit(EXIT_FAILURE);
}

pidfile_write(pfh);

for (;;) {
    /* Do work. */
    childpid = fork();
    switch (childpid) {
        case -1:
            syslog(LOG_ERR, "Cannot fork(): %s.", strerror(errno));
            break;
        case 0:
            pidfile_close(pfh);
            /* Do child work. */
            break;
        default:
            syslog(LOG_INFO, "Child %d started.", childpid);
            break;
    }
}

pidfile_remove(pfh);
exit(EXIT_SUCCESS);

此博客中的热门博文

少写代码,多读别人写的代码

在windows下使用llvm+clang

tensorflow distributed runtime初窥