keepalived源码浅析——pid文件
来源:互联网 发布:网络审核员 编辑:程序博客网 时间:2024/05/17 07:12
Pidfile.h 源码如下:
#ifndef _PIDFILE_H#define _PIDFILE_H/* system include */#include <unistd.h>#include <stdio.h>#include <signal.h>#include <sys/types.h>#include <syslog.h>/* lock pidfile */#define KEEPALIVED_PID_FILE "/var/run/keepalived.pid"#define KEEPALIVED_VRRP_PID_FILE "/var/run/keepalived_vrrp.pid"#define KEEPALIVED_CHECKERS_PID_FILE "/var/run/keepalived_checkers.pid"#define VRRP_PID_FILE "/var/run/vrrp.pid"#define CHECKERS_PID_FILE "/var/run/checkers.pid"/* Prototypes */extern int pidfile_write(char *, int);extern void pidfile_rm(char *);extern int keepalived_running(int);#endif
Pidfile.c 源码如下:
#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include "logger.h"#include "pidfile.h"extern char *main_pidfile;extern char *checkers_pidfile;extern char *vrrp_pidfile;/* Create the runnnig daemon pidfile */ #创建pid文件,将getpid()函数获取的pid写入文件intpidfile_write(char *pid_file, int pid){FILE *pidfile = NULL;int pidfd = creat(pid_file, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);if (pidfd != -1) pidfile = fdopen(pidfd, "w"); //fdopen()会将参数fildes 的文件描述词,转换为对应的文件指针后返回 if (!pidfile) {log_message(LOG_INFO, "pidfile_write : Can not open %s pidfile", pid_file);return 0;}fprintf(pidfile, "%d\n", pid);fclose(pidfile);return 1;}/* Remove the running daemon pidfile */ //#删除pid文件voidpidfile_rm(char *pid_file){unlink(pid_file);}/* return the daemon running state */ //返回守护进程的运行状态 运行返回1 停止返回0 intprocess_running(char *pid_file){FILE *pidfile = fopen(pid_file, "r"); pid_t pid;int ret;/* No pidfile */ //pid文件不存在情况if (!pidfile)return 0;ret = fscanf(pidfile, "%d", &pid); //获取pid文件中的pid数值if (ret == EOF && ferror(pidfile) != 0) {log_message(LOG_INFO, "Error opening pid file %s", pid_file);}fclose(pidfile);/* If no process is attached to pidfile, remove it */ //如果对应的进程不存在则除去僵尸pid文件if (kill(pid, 0)) {log_message(LOG_INFO, "Remove a zombie pid file %s", pid_file);pidfile_rm(pid_file);return 0;}return 1;}/* Return parent process daemon state */ //判断父进程的运行状态 根据模式 分别判断主进程 vrrp checks等pid文件 运行返回1 停止返回0 intkeepalived_running(int mode){if (process_running(main_pidfile))return 1;else if (mode & 1 || mode & 2)return process_running((mode & 1) ? vrrp_pidfile : checkers_pidfile);if (process_running(vrrp_pidfile) || process_running(checkers_pidfile))return 1;return 0;}
调用位置:
main.c中
/* write the father's pidfile */if (!pidfile_write(main_pidfile, getpid()))
check_daemon.c中
/* Child process part, write pidfile */if (!pidfile_write(checkers_pidfile, getpid())) {log_message(LOG_INFO, "Healthcheck child process: cannot write pidfile");exit(0);}
vrrp_daemon.c 中
/* Child process part, write pidfile */if (!pidfile_write(vrrp_pidfile, getpid())) {/* Fatal error */log_message(LOG_INFO, "VRRP child process: cannot write pidfile");exit(0);}
- keepalived源码浅析——pid文件
- keepalived源码浅析——日志
- keepalived源码浅析——sock
- keepalived源码浅析——SSL engine
- keepalived源码浅析——Html
- keepalived源码浅析——Notify
- keepalived源码浅析——Daemon进程
- keepalived源码浅析——Memory 内存管理
- keepalived源码浅析——Global_data全局定义块
- keepalived源码浅析——Global_data全局数据解析
- keepalived源码浅析——parser关键字解析
- mysql——pid文件
- Linux/Unix下pid文件作用浅析
- Linux/Unix下pid文件作用浅析
- Linux/Unix下pid文件作用浅析
- Linux/Unix下pid文件作用浅析
- Linux/Unix下pid文件作用浅析
- Linux/Unix下pid文件作用浅析
- viewpager的简单使用
- Android项目->天气预报项目
- 编写多线程的 Java 应用程序
- Non-ASCII character '\xca' in file
- Uboot 之Makefile 分析
- keepalived源码浅析——pid文件
- mysql
- CentOS-6.4-x86_64-minimal Nginx编译和安装
- 字符串循环右移问题?
- 软件测试工具LoadRunner常用函数
- HDU 1166 敌兵布阵 (线段树)
- wifi 交互过程
- 朋友圈
- 如何在Oracle中复制表结构和表数据