POSIX信号

一、信号的概念

  信号(signal)就是告知某个进程发生了某个事件的通知;信号通常是异步发生的,也就是说接受信号的进程不知道信号的准确

  发生时刻;信号可以

  (1)由一个进程发给另一个进程;

  (2)由内核发给某个进程

二、信号的处置

  每个信号都有一个与之关联的处置,即收到特定信号时的处理方法;可以通过调用sigaction函数来设定一个信号的处置

  

    处置方法有三种:

  (1)提供一个函数,只要有特定信号发生它就被调用,这样的函数称为信号处理函数,这种行为称为捕获信号;有两个信号SIGKILL和

      SIGSTOP不能被捕获;信号处理函数由信号值这个单一的整数参数来调用,且没有返回值,其函数原型如下:     

void handler(int signo);

  (2)可以把某个信号的处置方法设定为SIG_IGN来忽略它;SIDKILL和SIDSTOP这两个信号不能被忽略

  (3)可以把某个信号的处置方法设定为SIG_DEF来启用它的默认处置;有个别信号的默认处置为忽略,如SIGCHLD和SIGURG

扫描二维码关注公众号,回复: 5850523 查看本文章

三、signal函数

#include <signal.h>

typedef void Sigfunc(int);

Sigfunc *signal(int signo, Sigfunc *func) {
    struct sigaction act, oact;

    act.sa_handler = func;  /* 设置处置方法 */
    sigemptyset(&act.sa_mask); /* 把sa_mask置为空集,在信号处理期间不阻塞额外的信号 */
    act.sa_flags = 0;
    if (signo == SIGALRM) { /* 在POSIX兼容的平台上,SIGALRM是在定时器终止时发送给进程的信号 */
#ifdef SA_INTERRUPT
        act.sa_flags |= SA_INTERRUPT; /* SunOS 4.x */
#endif
    } else {
#ifdef SA_RESTART
    act.sa_flags |= SA_RESTART; /* SVR4, 4.4BSD */
#endif
    }
    if (sigaction(signo, &act, &oact) < 0) {
    return SIG_ERR;
    }
    return (oact.sa_handler);
}

四、处理每个信号的选项标志(sa_flags)

猜你喜欢

转载自www.cnblogs.com/soldierback/p/10690783.html
今日推荐