• signal


    signal

    信号提供一种机制,告诉用户进程发生了那些异常。

    linux信号量

    编号信号名称缺省动作说明
    1SIGHUP终止终止控制终端或进程
    2SIGINT终止键盘产生的中断(Ctrl-C)
    3SIGQUITdump键盘产生的退出
    4SIGILLdump非法指令
    5SIGTRAPdumpdebug中断
    6SIGABRT/SIGIOTdump异常中止
    7SIGBUS/SIGEMTdump总线异常/EMT指令
    8SIGFPEdump浮点运算溢出
    9SIGKILL终止强制进程终止
    10SIGUSR1终止用户信号,进程可自定义用途
    11SIGSEGVdump非法内存地址引用
    12SIGUSR2终止用户信号,进程可自定义用途
    13SIGPIPE终止向某个没有读取的管道中写入数据
    14SIGALRM终止时钟中断(闹钟)
    15SIGTERM终止进程终止
    16SIGSTKFLT终止协处理器栈错误
    17SIGCHLD忽略子进程退出或中断
    18SIGCONT继续如进程停止状态则开始运行
    19SIGSTOP停止停止进程运行
    20SIGSTP停止键盘产生的停止
    21SIGTTIN停止后台进程请求输入
    22SIGTTOU停止后台进程请求输出
    23SIGURG忽略socket发生紧急情况
    24SIGXCPUdumpCPU时间限制被打破
    25SIGXFSZdump文件大小限制被打破
    26SIGVTALRM终止虚拟定时时钟
    27SIGPROF终止profile timer clock
    28SIGWINCH忽略窗口尺寸调整
    29SIGIO/SIGPOLL终止I/O可用
    30SIGPWR终止电源异常
    31SIGSYS/SYSUNUSEDdump系统调用异常

    sigaction 函数

    int sigaction(int signum, // 信号量
    			  const struct sigaction *act, // 设置对信号量新的处理方式
    			  struct sigaction *oldact);   // oldact如果非空,会将原来的信号量处理方式保存到oldact
    
    • 1
    • 2
    • 3

    sigaction结构体

    struct sigaction {
        void     (*sa_handler)(int);
        void     (*sa_sigaction)(int, siginfo_t*, void*);
        sigset_t   sa_mask;
        int        sa_flags;
        void     (*sa_restorer)(void);
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • sa_handle, 指定信号捕捉后的处理函数名(即注册函数)。也可赋值为

      • SIG_IGN表忽略
      • SIG_DFL表执行默认动作
    • sa_sigaction, 如果sa_flags 设置了SA_SIGINFO, sa_sigaction可以替代sa_handle指定信号捕捉后处理函数名(即注册函数)

      • int, signal num
      • siginfo_t *
      • ucontext_t (cast to void *)
    • sa_flags, 修改信号行为的标志

    • sa_mask, 调用信号处理函数时,所要屏蔽的信号集合

    • sa_restorer, 为了返回旧的信号处理程序,但现在应该是已经弃用了

    • SA_ONSTACK 在信号处理程序的执行期间使用备用信号堆栈。[1,2]

      Here is one example…a process has a limit on the size of the stack. If a process exceeds that limit it will get a signal, often SIGSEGV, but it can vary from os to os. Now, how can you catch that signal? Without an alternate stack, the signal handler could never run.

      I had this exact situation once. A process was dying from a blown stack but its current directory was in a filesystem that was too small to hold a core dump. My handler needed to catch the signal, cd to a large filesystem, set the signal action back to default, and resend the signal to itself. I could not have done that without an alternate stack.

      That was the only time that I needed an alternate stack.

    • SA_RESTART, 当信号处理函数返回后, 被该信号中断的系统调用将自动恢复.[3]

    • SA_SIGINFO, sa_sigaction可以替代sa_handle指定信号捕捉后处理函数名(即注册函数)

    siginfo_t

    typedef struct {
        int si_signo;
        int si_code;
        union sigval si_value;
        int si_errno;
        pid_t si_pid;
        uid_t si_uid;
        void *si_addr;
        int si_status;
        int si_band;
    } siginfo_t;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • si_signo, signal number
    • si_code
    • si_errno
    • si_pid, 发送该信息的进程pid
    • si_uid, 发送该信息的用户uid
    • si_addr, 错误发生的地址

    sigaddset

    int sigaddset(sigset_t *set, int signum);
    
    • 1
    typedef struct {
    	unsigned long sig[_NSIG_WORDS];
    } sigset_t
    
    • 1
    • 2
    • 3

    sigemptyset

    int sigemptyset(sigset_t *set)
    
    • 1

    将参数set信号集初始化并清空

    pthread_sigmask

    屏蔽某个线程对某些信号的 响应处理

    int pthread_sigmask(int how, const sigset_t *set, sigset_t *oldset);
    How:
    SIG_BLOCK:     结果集是当前集合参数集的并集
    SIG_UNBLOCK: 结果集是当前集合参数集的差集
    SIG_SETMASK: 结果集是由参数集指向的集
    
    • 1
    • 2
    • 3
    • 4
    • 5

    sigfillset

    int sigfillset(sigset_t *set);
    
    • 1

    set指向的信号集中将包含linux支持的信号量

    sigdelset

    int sigdelset(sigset_t *set, int signum);
    
    • 1

    在set指向的信号集中删除signum信号

    ucontext_t

    // ucontext.h
    typedef struct ucontext {
      unsigned long int uc_flags;
      struct ucontext *uc_link; // 指向一个上下文,当当前上下文结束时,将返回执行该上下文
      stack_t uc_stack; // 栈信息
      mcontext_t uc_mcontext; // 保存上下文的各种寄存器信息
      __sigset_t uc_sigmask; // 屏蔽的信号量集合
      struct _libc_fpstate __fpregs_mem;
    } ucontext_t;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    stack_t

    typedef struct {
      void *ss_sp; // 栈空间指针,指向当前栈所在的位置
      int ss_flags; // 栈空间的flags
      size_t ss_size; // 整个栈的大小
    } stack_t;
    
    • 1
    • 2
    • 3
    • 4
    • 5

    mcontext_t

    • 相关阅读:
      【java基础-实战2】数组拷贝的几种实现方式
      操作符知识你会了,那表达式求值呢?
      POSIX与System v消息队列
      tcpdump后台不间断抓包
      域名列入备案黑名单解除教程
      仿英雄联盟网页HTML代码 学生网页设计与制作期末作业下载 大学生网页设计与制作成品下载 DW游戏介绍网页作业代码下载
      微服务保护
      基于Java毕业设计斗南基地鲜花网上销售管理系统源码+系统+mysql+lw文档+部署软件
      (数据结构)算法的时间复杂度
      Flask实现Web服务调用Python程序
    • 原文地址:https://blog.csdn.net/idealcitier/article/details/128075462