linux上的c-lock文件,如果lock成功成为守护进程



我想编写一个程序,使其成为按需守护程序:

if_there_are_no_daemon_alive_start_daemon();
pass_job_to_daemon();

我坚持CCD_ 1的实现。首先我想到的是试图锁定文件CCD_ 2,如果成功,那么做双叉并完成,如果没有,则守护进程已启动并正在运行,并且有时间调用CCD_ 3。

但在父进程中获得的文件锁定,在父进程结束后就消失了:

#include <assert.h>
#include <fcntl.h>
#include <sys/file.h>
#include <unistd.h>
#include <stdio.h>
int main(int argc, char *argv[]) {
assert(argc > 1);
int fd = open(argv[1], O_WRONLY | O_APPEND | O_CREAT, 0600);
assert(fd >= 0);
int ret = flock(fd, LOCK_EX);
assert(ret == 0); 
printf("get flockn");
pid_t pid = fork();
assert(pid >= 0);
if (pid == 0) {
printf("child processn");   
sleep(5); //<-- no flock here according to lslocks
printf("child donen");                
} else {
printf("parent: time to exitn");
}
return 0; 
}  

那么,我可以在这里使用什么变体的进程间锁,检查守护进程是否运行atomic,然后在双分叉后将此锁传递给子进程,而不会出现问题?

锁定文件不需要任何文件锁定,例如flock。文件的存在被用作锁。将O_EXCL添加到open调用中。如果open成功,则表示您已锁定;然后释放锁定你的removeunlink文件。在崩溃的情况下,您需要对过时的锁文件进行一些处理。这就是它们通常在特定目录中创建的原因之一,因为系统启动脚本知道它并删除锁定文件。

相关内容

最新更新