本文共 2030 字,大约阅读时间需要 6 分钟。
信号是一个中断软件,它用于通知进程某种事件发生。在典型的 Embedded Unix 系统中,信号有两种形式:可靠和非可靠。
信号可以通过 硬件 或 软件 生成,并影响目标进程。
kill -9 PID
。信号注册是将信号映射到特定处理函数的过程。Linux 使用 sigarrays 来处理信号。
非可靠信号:
sigqueue
节点,添加至 sigqueue 队列。可靠信号:
sigqueue
节点,强制添加至 sigqueue 队列(重复也会拉取)。信号注销仅适用于非可靠信号,因为可靠信号无法回滞。
sigqueue
节点。信号处理可以是默认或者自定义处理。
signal
函数定义处理函数: typedef void (*sighandler_t)(int);int signal(int signum, sighandler_t handler);
例如:
signal(2, sigback); // 处理 2号信号
sigaction
函数允许更复杂的处理逻辑。
struct sigaction { void (*sa_handler)(int); // 处理函数指针 void (*sa_sigaction)(int, siginfo_t *, void*); // 复杂处理 sigset_t sa_mask; // collector mask int sa_flags; // SA_* 标记 void (*sa_restorer)(void); // 恢复函数};
void sigback(int signo) { printf("signo: %d\n", signo); }int main() { struct sigaction act; act.sa_flags = SA_SIGINFO; // 设置处理方式为 sigaction 函数 act.sa_handler = sigback; sigaction(2, &act, NULL); while (1) { printf("linux so easy!\n"); sleep(1); } return 0;}
信号捕捉发生在:
do_signal
函数处理信号。do_signal
。sa_handler
或 sa_sigaction
根据 sa_flags
调用相应函数。信号阻塞允许进程暂时不响应特定信号。
sigprocmask
函数设置 sig_set
和 sig_unblock
操作模式。#include#include int main() { sigset_t mask; sigset_t old_mask; sigempty(mask); // 初始化阻塞位图 sigprocmask(SIG_BLOCK, &mask, &old_mask); // 之后可以根据需求调用 sig_unblock 或 sig_setmask sleep(1); return 0;}
通过以上方法,可以更好地管理和处理信号,在嵌入式开发中实现高效 middlewares。
转载地址:http://lnacz.baihongyu.com/