双进程互相保活-flock实现

进程保活是一种恶意软件的常用手段

这里介绍一种利用文件系统锁机制来进行保活的方法

原理:
1、文件系统互斥锁只能被同一个进程持有,其他进程try lock时会阻塞
2、进程退出时,会自动释放其持有的文件锁

A进程创建文件file1,lock住,然后try lock file2,如果成功,说明B进程已死,拉起,重新try lock
B进程创建文件file2,lock住,然后try lock file1,如果成功,说明A进程已死,拉起,重新try lock

实现效果

还有BUG,待修改

实现源码(很挫,待修改)

#include <stdio.h>
#include <sys/file.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <string.h>

int main(int argc, char* argv[])
{
        printf("%c: start to run\n", argv[1][4]);
        int fd_self = open(argv[1], O_RDONLY);
        if (fd_self < 0) {
                printf("Error @ open %s: %d(%s)\n", argv[1], errno, strerror(errno));
        } else {
                printf("%c: open %s success!\n", argv[1][4], argv[1]);
        }

        flock(fd_self, LOCK_EX);
        printf("%c: Lock %s success!\n", argv[1][4], argv[1]);

        sleep(10);
        int fd = open(argv[2], O_RDONLY);
        if (fd < 0) {
                printf("Error @ open %s: %d(%s)\n", argv[2], errno, strerror(errno));
        } else {
                printf("%c: open %s sucess!\n", argv[1][4], argv[2]);
        }

        while (1) {
                printf("%c: try to lock %s...\n", argv[1][4], argv[2]);
                flock(fd, LOCK_EX);
                printf("%c: My child has been killed! Save it!\n", argv[1][4]);
                flock(fd, LOCK_UN);

                char str[256] = {""};
                strcat(str, "./process ");
                strcat(str, argv[2]);
               strcat(str, " ");
                strcat(str, argv[1]);
                strcat(str, " &");
                system(str);
                sleep(3);
        }
}

上一篇:Linux 文件总结(二)


下一篇:工具之外,如何高效的阅读代码?