• POSIX信号处理


    信号用于通知进程发生了某件事情,可以由一个进程发给另一个进程,也可以由内核发个一个进程。

    每个信号都有一个关联的行为,可以通过sigaction函数来设置一个信号的行为,有3种选择:

    1、定义一个信号处理函数捕获信号,在信号发生时被调用。SIGKILL和SIGSTOP信号不能捕获

    信号处理函数原型:void handler (int signo)

    2、忽略信号,即把信号的行为设定为SIG_IGN,同样SIGKILL和SIGSTOP信号不能忽略

    3、缺省行为,即把信号行为设定为SIG_DFL

    signal函数:标准C的信号接口

    void ( *signal (int signo, void (*func) (int)) ) (int)

    加粗部分是函数名和参数列表,没加粗部分是函数的返回类型,返回一个参数是int,没有返回值的函数指针。

    第一个参数是信号名,第二个参数是指向信号处理函数的指针,或为常值SIG_IGN或SIG_DFL

    sigaction函数:POSIX标准信号接口

    int sigaction (int signo, const struct sigaction *act, sigaciton *oact)

    参数act定义了信号的行为

    函数把信号先前的行为保存到参数oact所指的位置

    struct sigaction {

      union{                  

      __sighandler_t sa_handler;                                             //SIG_IGN或SIG_DFL

      void (*_sa_sigaction)(int,struct siginfo *, void *);            //信号处理函数指针

      }_u

      sigset_t sa_mask;                    //该信号集中的信号被加入到进程的信号屏蔽字中,这些信号发生时会被阻塞而不会传递给进程

      unsigned long sa_flags;            //通过设置标志来控制信号处理函数的相关操作

      void (*sa_restorer)(void);         //暂没使用

      }

    SIGCHLD信号的处理

    一个进程终止时,会向它的父进程发送一个SIGCHLD信号

    多进程程序中,如果有子进程处于僵死状态,会造成资源的浪费,所以需要捕获SIGCHLD信号,在信号处理函数中调用wait或者waitpid函数

    处理僵死进程。

    在网络程序中,捕获信号可能会中断系统调用。在系统调用被中断,且信号处理函数返回时,系统调用可能返回一个EINTR错误记录在errno中,

    可以利用EINTR错误重启系统调用

    SIGPIPE信号

    当进程向一个已收到RST的套接口写数据时,内核向进程发送一个SIGPIPE信号,缺省行为是终止进程。所以进程有必要捕获这个信号,定义

    想要的行为。

    生活不止眼前的苟且 还有诗和远方的田野
  • 相关阅读:
    嫁给程序员1314的好处
    TCP/IP、Http、Socket、XMPP-从入门到深入
    Redis集群案例与场景分析
    Java程序片段
    Spring Security(08)——intercept-url配置
    python virtualenv virtualenvwrapper
    django 删除表后如何恢复
    mysql行转列,单列转多行
    mysql开发之join语句学习
    django前后端数据传输学习记录
  • 原文地址:https://www.cnblogs.com/jc-nogame/p/4349234.html
Copyright © 2020-2023  润新知