keepalived源码浅析——Notify
来源:互联网 发布:java 汉字变拼音 编辑:程序博客网 时间:2024/06/07 04:02
Notify 模块作用是执行系统外部脚本,其中 notify_exec函数用在脚本 notify_down 、notify_up、notify_fault 指令
Notify.h 源码
Notify.c的头文件
#ifndef _NOTIFY_H#define _NOTIFY_H/* system includes */extern int system_call(char *cmdline);extern void closeall(int fd);extern int notify_exec(char *cmd);#endif
Notify.c 源码
#include <unistd.h>#include <stdlib.h>#include <syslog.h>#include <fcntl.h>#include <errno.h>#include "notify.h"#include "signals.h"#include "logger.h"/* perform a system call */intsystem_call(char *cmdline) // 执行系统的调用{int retval;retval = system(cmdline);if (retval == 127) {/* couldn't exec command */log_message(LOG_ALERT, "Couldn't exec command: %s", cmdline);} else if (retval == -1) {/* other error */log_message(LOG_ALERT, "Error exec-ing command: %s", cmdline);}return retval;}/* Close all FDs >= a specified value */ //关闭所有打开的文件 voidcloseall(int fd){int fdlimit = sysconf(_SC_OPEN_MAX); // Linux 允许同时打开的最大文件数量while (fd < fdlimit)close(fd++);}/* Execute external script/program */ //执行外部脚本 或者程序intnotify_exec(char *cmd){pid_t pid;int ret;pid = fork();/* In case of fork is error. */if (pid < 0) {log_message(LOG_INFO, "Failed fork process");return -1;}/* In case of this is parent process */if (pid)return 0;signal_handler_destroy();closeall(0);open("/dev/null", O_RDWR);ret = dup(0); //dup应该是调用fork创建子进程,在写时复制的时候子进程拥有父进程同样的上下文时候用来克隆if (ret < 0) {log_message(LOG_INFO, "dup(0) error");}ret = dup(0);if (ret < 0) {log_message(LOG_INFO, "dup(0) error");}system_call(cmd);exit(0);}
#############################################################################################################################
其他问题解释:
dup 和 dup2 都可以用来复制一个现存的文件描述符。经常用来重新定向进程的 STDIN, STDOUT, STDERR。
dup 函数
dup 函数定义在 <unistd.h> 中,函数原形为:
int dup ( int filedes ) ;
函数返回一个新的描述符,这个新的描述符是传给它的描述符的拷贝,若出错则返回 -1。由dup返回的新文件描述符一定是当前可用文件描述符中的最小数值。这函数返回的新文件描述符与参数 filedes 共享同一个文件数据结构。
复制一个现有的句柄,产生一个与“源句柄特性”完全一样的新句柄(也即生成一个新的句柄号,并关联到同一个设备)
要提的是这个头文件同时定义了下面三个常量:
STDERR_FILENO = 2 标准错误输出
STDIN_FILENO = 0 标准输入
STDOUT_FILENO = 1 标准输出
- keepalived源码浅析——Notify
- keepalived源码浅析——日志
- keepalived源码浅析——pid文件
- keepalived源码浅析——sock
- keepalived源码浅析——SSL engine
- keepalived源码浅析——Html
- keepalived源码浅析——Daemon进程
- keepalived源码浅析——Memory 内存管理
- keepalived源码浅析——Global_data全局定义块
- keepalived源码浅析——Global_data全局数据解析
- keepalived源码浅析——parser关键字解析
- JDK8—LinkedHashMap源码浅析
- Keepalived系列—配置文件keepalived.conf详解
- JDK-Map源码浅析——IdentityHashMap
- Couchbase源码浅析——Couchstore部分
- mina源码浅析——总结
- JDK源码研究——ReentrantLock浅析
- Linux-----源码安装keepalived
- ECLIPSE中设置.CLASS文件的输出路径及“JAVA BUILD PATH”的设置
- 不允许 dllimport 静态数据成员
- Asp.net 导出Excel
- 使用异步 I/O 大大提高应用程序的性能
- master/slave主从数据库手动同步之master-data
- keepalived源码浅析——Notify
- Linux I/O调度策略
- java第十一章
- 模拟器游戏修改之教你如何修改gba rom里的程序!
- 用jstl截取字符串
- Nhibernate 分组排序(分组后内部排序)三五太难了
- 套接字API(一)socket函数
- 基于像素自适应分割的运动目标检测算法
- Tomcat --> Cannot create a server using the selected type