进程保活是一种恶意软件的常用手段
这里介绍一种利用文件系统锁机制来进行保活的方法
原理:
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); } }