zoukankan      html  css  js  c++  java
  • 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 环境高级编程》

  • 相关阅读:
    登录及注册页面
    多方式登录
    git笔记
    后台主页模块设计
    auth模块迁移后需新增字段
    使用idea构建SpringBoot源码
    Springboot相关面试问题
    Springboot自动加载工具-devtools的理解与使用
    SpringBoot项目的一些简单常用配置
    Java线程池及Executor框架的理解
  • 原文地址:https://www.cnblogs.com/ilocker/p/4647592.html
Copyright © 2011-2022 走看看