通过 flock 或 fcntl 对特定文件加锁,利用操作系统级别的锁机制实现互斥。
步骤:
创建并锁定文件:尝试对指定文件(如 /var/run/myapp.lock)加排他锁。
非阻塞检测:若加锁失败,说明已有实例运行,新进程退出。
保持锁:成功加锁后,保持文件描述符打开,直到进程结束。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/file.h>
#include <fcntl.h>
int main() {
int lock_fd = open("/tmp/myapp.lock", O_RDWR | O_CREAT, 0644);
if (lock_fd == -1) {
perror("无法打开锁文件");
exit(1);
}
// 非阻塞排他锁
if (flock(lock_fd, LOCK_EX | LOCK_NB) == -1) {
fprintf(stderr, "另一个实例正在运行\n");
close(lock_fd);
exit(1);
}
printf("进程 PID: %d 正在运行...\n", getpid());
while (1) {
sleep(1); // 模拟主逻辑
}
close(lock_fd);
return 0;
}