#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/file.h>
#include <fcntl.h>
#include <errno.h>
#define LOCK_FILE "/var/run/dtu_demo.lock"
int create_lock_file() {
int lock_fd = open(LOCK_FILE, O_RDWR | O_CREAT, 0644);
if (lock_fd == -1) {
perror("Unable to open lock file");
return -1;
}
if (flock(lock_fd, LOCK_EX | LOCK_NB) == -1) {
if (errno == EWOULDBLOCK) {
printf("Another instance is already running. Exiting.\n");
} else {
perror("Unable to lock file");
}
close(lock_fd);
return -1;
}
// 写入进程ID(可选)
char pid_str[16];
snprintf(pid_str, sizeof(pid_str), "%d\n", getpid());
ftruncate(lock_fd, 0);
write(lock_fd, pid_str, strlen(pid_str));
return lock_fd;
}
int main() {
// 尝试创建并锁定文件
int lock_fd = create_lock_file();
if (lock_fd == -1) {
return EXIT_FAILURE;
}
printf("Starting dtu_demo...\n");
// 这里添加你的主程序逻辑
while (1) {
sleep(1);
// 主程序工作
}
// 程序结束时清理(通常不会执行到这里)
close(lock_fd);
unlink(LOCK_FILE);
return EXIT_SUCCESS;
}
-
文件锁方案更可靠,因为它能避免竞态条件
-
锁文件通常放在
/var/run/目录下,可能需要root权限 -
程序异常退出时,锁会自动释放(因为文件描述符会被内核关闭)
-
如果需要普通用户权限运行,可以将锁文件放在用户可写的目录,如
/tmp/
推荐使用文件锁方案,因为它更加可靠和标准。
2282

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



