zoukankan      html  css  js  c++  java
  • 信号处理

    一、基本概念

      1、中断分为软件中断和硬件中断

      2、信号是一种软件中断,是进程与进程,进程与内核的一种通信方式

      

    3、常见的信号

    SIGINT(2)

    中断中断信号Ctrl+c
    SIGQUIT(3) 终端退出信号Ctrl+
    SIGABRT(6) 调用abort函数产生的信号
    SIGFPE(8) 算术信号
    SIGKILL(9) 死亡信号
    SIGSEGV(11) 段错误信号
    SIGALRM(14) 闹钟信号
    SIGCHLD(17) 子进程结束信号
    SIGCONT(18) 进程继续信号
    SIGSTOP(19) 进程暂停信号
    SIGTSTP(20) 终端停止信号

      4、编号小于SIGRGMI(34)的信号都是不可靠信号,不支持排队,因此接收时可能会丢失

      5、编号位于[SIGRGMI(34),SIGRTMAX(64)]区间的都是可靠信号,此种信号支持排队,不会丢失

    二、signal

    1 typedef void (*sighandler_t)(int);
    2 sighandler_t signal(int signum, sighandler_t handler);
    3 功能:向内核注册一个信号处理的函数
    4     signum:信号的编号,可以直接写数字,也可以用系统提供的宏
    5     handler:函数指针
    6         SIG_DFL    恢复信号默认的处理方式
    7         SIG_IGN    忽略信号
    8     返回值:是之前信号的处理方式
    9         函数指针、SIG_DFL、SIG_IGN、SIN_ERR

    三、信号的发送

      1、由硬件产生的软件信号,如:键盘Ctrl+c,Ctrl+,Ctrl+z,

      2、错误产生的信号,如:非法访问内存,除0,硬件总线

      3、命令产生的信号,如:kill,killall

      4、函数产生的信号

        

    1     int kill(pid_t pid,int sig);
    2     功能:向指定的进程发送信号
    3         pid:与watipid一样
    4         sig:信号
    5     0 表示空信号,不会向进程发送信号,但是会测试是否能向进程发送信号,这样可以检测一个进程是否存在,返回-1,表示进程不存在,errno为ESRCH
    6     返回值:-1,说明进程不存在
    7                 
    8     int raise(int sig);
    9     功能:向自己发送信号

    四、睡眠函数

     1     int pause(void);
     2     功能:休眠
     3     进程调用了pause函数后会进入睡眠状态,直到有信号把他叫醒(不被忽略的信号)
     4     pause函数要么不返回(一直睡眠),要么返回-1
     5 
     6     unsigned int sleep(unsigned int seconds);
     7     功能:使用调用的进程睡眠seconds秒
     8     调用sleep的进程如果没有睡眠足够的秒数,除非收到信号后才会返回
     9     sleep的返回值是0,或剩余的秒数
    10         
    11     int usleep(useconds_t usec);
    12     功能:睡眠usec微秒
    13 
    14     unsigned int alarm(unsigned int seconds);
    15     功能:定时一个闹钟信号
    16     让内核向调用它的进程,在seconds秒后发送一个 SIGALRM(14)信号    
    17     SIGALRM信号的默认处理方式是直接退出

    五、信号集和信号屏蔽

     1 a、信号集
     2     int sigemptyset(sigset_t *set);
     3     功能:清空信号集
     4 
     5     int sigfillset(sigset_t *set);
     6     功能:填满信号集
     7 
     8     int sigaddset(sigset_t *set, int signum);
     9     功能:向信号集中添加信号
    10 
    11     int sigdelset(sigset_t *set, int signum);
    12     功能:从信号集中删除信号
    13         
    14     int sigismember(const sigset_t *set, int signum);
    15     功能:测试一个信号集中是否存在某个信号
    16 b、屏蔽信号集中的信息
    17     int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);
    18     功能:设置进程的信号掩码(信号屏蔽码)
    19         how:修改信号掩码的方式
    20                 SIG_BLOCK 向信号掩码中添加信号,并集(以信号集的方式添加)
    21                 SIG_UNBLOCK 从信号掩码中删除信号,补集的交集
    22                 SIG_SETMASK 用新的信号集替换旧的信号掩码
    23         newset:新添加、删除、替换的信号集,也可以为空
    24         oldset:获取旧的信号掩码
    25         当newset为空时,就是在备份信号掩码
    26 c、sigpending
    27     int sigpending(sigset_t *set);
    28     功能:获取未决状态的信号

    六、信号处理函数

     1     int sigaction(int signum, const struct sigaction *act,struct sigaction *oldact);
     2     功能:设置或获取信号处理
     3 
     4     struct sigaction {
     5         void (*sa_handler)(int);//信号处理函数指针
     6         void (*sa_sigaction)(int, siginfo_t *, void *);//信号处理函数指针
     7                             int signum:信号码
     8                             siginfo_t* info:系统自带结构体
     9                             void* ptr:保留
    10         sigset_t sa_mask;//信号屏蔽码
    11         int sa_flags;
    12                 SA_NOCLDSTOP:SIGSTOP,SIGTSTP,SIGTTIN、SIGTTOU 子进程停止,忽略SIGCHLD信号
    13                 SA_NODEFER/SA_NOMASK:在处理信号时不屏蔽信号
    14                 SA_RESETHAND:处理完信号后,恢复系统默认处理方式
    15                 SA_RESTART:当信号处理函数中断了系统调用,则重启系统调用
    16                 SA_SIGINFO:用sa_sigaction处理信号
    17         void (*sa_restorer)(void);//保留(NULL)
    18     };
    19 
    20     int sigqueue(pid_t pid, int sig, const union sigval value);    
  • 相关阅读:
    Java 面向对象(二)封装
    Java 面向对象(一)面向对象思想
    Java 字符串(二)字符串常用操作
    Java 字符串(一)字符串初始化
    JavaScript 流程控制(二)循环结构
    【剑指Offer-知识迁移能力】面试题58:翻转单词顺序
    【剑指Offer-知识迁移能力】面试题57.2:和为s的连续整数序列
    【剑指Offer-知识迁移能力】面试题57:合为s的两个数字
    【剑指Offer-知识迁移能力】面试题56:数组中只出现一次的两个数字
    【剑指Offer-知识迁移能力】面试题55.2:平衡二叉树
  • 原文地址:https://www.cnblogs.com/xkk956227639/p/9368336.html
Copyright © 2011-2022 走看看