本文主要是介绍AFL setup_signal_handlers,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
不太理解sigaction及其中字段的含义和用法:
static void setup_signal_handlers(void) {struct sigaction sa; // 定义一个sigaction结构体变量sa// 初始化sa结构体sa.sa_handler = NULL; // 默认的信号处理函数设置为NULLsa.sa_flags = SA_RESTART; // 设置标志为SA_RESTART,使被信号打断的系统调用自动重启sa.sa_sigaction = NULL; // 复杂信号处理函数设置为NULLsigemptyset(&sa.sa_mask); // 初始化信号集为empty,即不阻塞任何信号/* Various ways of saying "stop". */// 设置处理"停止"信号的处理函数sa.sa_handler = handle_stop_sig; // handle_stop_sig是一个函数,用于处理SIGHUP, SIGINT, SIGTERM这些信号sigaction(SIGHUP, &sa, NULL); // 当收到挂起信号时调用handle_stop_sigsigaction(SIGINT, &sa, NULL); // 当收到中断信号时调用handle_stop_sigsigaction(SIGTERM, &sa, NULL); // 当收到终止信号时调用handle_stop_sig/* Exec timeout notifications. */// 设置处理超时通知的处理函数sa.sa_handler = handle_timeout; // handle_timeout是一个函数,用于处理SIGALRM信号sigaction(SIGALRM, &sa, NULL); // 当收到定时器到期信号时调用handle_timeout
}
先去了解下,有没有描述的清楚的中文博客。
感觉大部分博客都描述的差不多,还是不太理解。
需要再往前追溯下,什么是Linux中的信号?
看了这篇博客:https://blog.csdn.net/qq_45358642/article/details/129758736,
简单总结下,信号可以进程、线程、甚至用户(kill)主动发出的,进程可以通过注册信号处理函数来接收信号并处理,大概就是这么个意思。
下面这段代码:
sa.sa_handler = handle_stop_sig; // handle_stop_sig是一个函数,用于处理SIGHUP, SIGINT, SIGTERM这些信号sigaction(SIGHUP, &sa, NULL); // 当收到挂起信号时调用handle_stop_sigsigaction(SIGINT, &sa, NULL); // 当收到中断信号时调用handle_stop_sigsigaction(SIGTERM, &sa, NULL); // 当收到终止信号时调用handle_stop_sig
如果收到了SIGHUP, SIGINT, SIGTERM这3个信号,那么就调用handle_stop_sig处理,后面handle_timeout也是类似的。
暂时就理解这么多,大概知道用法就行。
这篇关于AFL setup_signal_handlers的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!