zoukankan      html  css  js  c++  java
  • 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信号,缺省行为是终止进程。所以进程有必要捕获这个信号,定义

    想要的行为。

    生活不止眼前的苟且 还有诗和远方的田野
  • 相关阅读:
    JVM(二)-运行时数据区
    JVM(一)-JVM入门
    java设计模式之观察者模式
    开散列表
    闭散列表
    VTWORAY 常用配置
    kubernetes 提示1 node(s) had taints that the pod didn't tolerate
    SOCKS5转PPTP VTWORAY配置文件与IPTables配置文件
    【Docker】多阶段构建
    【Docker】容器内存扩容
  • 原文地址:https://www.cnblogs.com/jc-nogame/p/4349234.html
Copyright © 2011-2022 走看看