Linux 信号(二)—— signal 函数
弗洛伊德认为:要解决这些苦恼,当事人就要通过回忆并理解自己早期的童年经历,来获得对潜意识冲突的顿悟。弗洛伊德的疗法被称为“精神分析” (psychoanalysis),在 20 世纪的很长一段时间被心理卫生从业者广为采用。 —— 《Change Your Thinking》
ilocker:关注 Android 安全(新入行,0基础) QQ: 2597294287
1 #include <signal.h> 2 void (*signal(int signo, void (*func)(int)))(int);
为 signo 指定的信号设置信号处理程序。成功则返回指向之前信号处理程序的函数指针,出错则返回 SIG_ERR。
如果看不懂 signal 的函数声明,就要好好复习一下 c/c++ 的基础(函数指针)了。
将 signal 函数的声明简化一下:
1 typedef void SigFunc(int); //信号处理函数原型 2 Sigfunc * signal(int signo, SigFunc * func);
简单示例:
1 void sig_handler(int signo) { 2 if (SIGUSR1 == signo) 3 printf(“received SIGUSR1.”); 4 else 5 printf(“received signal %d.”, signo); 6 } 7 8 int main() { 9 if (SIG_ERR == signal(SIGUSR1, sig_handler)) 10 printf(“can’t catch SIGUSR1”); 11 12 for ( ; ; ) 13 pause(); 14 }
还可将信号处理函数设置为 SIG_IGN (表示忽略此信号) 或 SIG_DFL (表示使用系统默认的信号处理程序)。
信号 SIGSTOP、SIGKILL 无法捕获或忽略。
记录以下两点,但没有验证,不确定是否表述正确:
- 假设正在执行信号 A 的处理程序,此时来了另一个信号 B,则会转去执行 B 的信号处理程序,处理完毕之后,再接着执行 A 的信号处理程序。
- 在进程中有一个软中断信号域,该域中每一位对应一个信号,当收到某一信号时,相应位会置位。所以,对于同一种信号,进程并不知道在处理之前已经收到过多少个。
除了 signal,还有 sigaction 函数可以设置信号处理函数,比 signal 要复杂些,后面接着再写笔记。
学习资料: 《unix 环境高级编程》
ilocker:关注 Android 安全(新手) QQ: 2597294287