单实例运行

有时候为避免冲突,会限制同一时刻最多只有一个进程副本在运行,一般通过记录锁机制来实现。具体做法是每个进程启动时打开一个固定名字的文件,并在该文件的整体上加一把写锁,在此之后创建写锁的尝试都将失败,向后续进程副本指明已经有一个副本在运行。当进程副本终止时,锁将被自动清除。

#include <fcntl.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>

#define LOCKFILE "/var/run/test.pid"

int IsRunning() {
    int fd;
    char buf[16];
    struct flock lock;

    fd = open(LOCKFILE, O_RDWR | O_CREAT, 0644);
    if (fd < 0) {
        perror("open");
        exit(1);
    }

    lock.l_type = F_WRLCK;
    lock.l_whence = F_WRLCK;
    lock.l_start = 0;
    lock.l_len = 0;
    if (fcntl(fd, F_SETLK, &lock) < 0) {
        if (errno == EACCES || errno == EAGAIN) {
            close(fd);
            return 1;
        }
        perror("fcntl");
        exit(1);
    }

    ftruncate(fd, 0);
    sprintf(buf, "%ld", (long)getpid());
    write(fd, buf, strlen(buf));
    return 0;
}

int main() {
    if (IsRunning()) {
        puts("another copy is running");
        return 0;
    } else for (;;sleep(1));
    return 0;
}
Table of Contents