sigaction函数详解

原文地址:http://sys.firnow.com/linux/x8002010n06m/24s9088986.html

   

sigaction 函数的功能是检查或修改与指定信号相关联的处理动作(可同时两种操作)。 他是POSIX 的信号接口,而signal() 是标准C 的信号接口( 如果程序必须在非POSIX 系统上运行,那么就应该使用这个接口) 给信号signum 设置新的信号处理函数act , 同时保留该信号原有的信号处理函数oldact。

         int sigaction(int signo,const struct sigaction *restrict act, struct sigaction *restrict oact);


结构sigaction 定义如下:

struct sigaction{
  void (*sa_handler)(int);
   sigset_t sa_mask;
  int sa_flag;
  void (*sa_sigaction)(int,siginfo_t *,void *);
};

sa_handler 字段包含一个信号捕捉函数的地址

sa_mask 字段说明了一个信号集,在调用该信号捕捉函数之前,这一信号集要加进进程的信号屏蔽字中。仅当从信号捕捉函数返回时再将进程的信号屏蔽字复位为原先值;

sa_flag 是一个选项,主要理解两个 SA_INTERRUPT 由此信号中断的系统调用不会自动重启,
SA_RESTART
由此信号中断的系统调用会自动重启, SA_SIGINFO 提供附加信息,一个指向 siginfo 结构的指针以及一个指向进程上下文标识符的指针。

最后一个参数是一个替代的信号处理程序,当设置SA_SIGINFO 时才会用他。


例子:

#include <stdio.h>
#include <signal.h>
#include <unistd.h>

void show_handler(int sig)
{
    printf("I got signal %d/n", sig);
    int i;
    for(i = 0; i < 5; i++) {
        printf("i = %d/n", i);
        sleep(1);
    }
}

int main(void)
{
    int i = 0;
    struct sigaction act, oldact;
    act.sa_handler = show_handler;
    sigaddset(&act.sa_mask, SIGQUIT); //
见注(1)
    act.sa_flags = SA_RESETHAND | SA_NODEFER; //
见注(2)
    //act.sa_flags = 0; //
见注(3)

    sigaction(SIGINT, &act, &oldact);
    while(1) {
        sleep(1);
        printf("sleeping %d/n", i);
        i++;
    }
}

注:
(1)
如果在信号SIGINT(Ctrl + c) 的信号处理函数show_handler 执行过程中,本进程收到信号SIGQUIT(Crt+/) ,将阻塞该信号,直到show_handler 执行结束才会处理信号SIGQUIT

(2)SA_NODEFER  一般情况下, 当信号处理函数运行时,内核将阻塞< 该给定信号 -- SIGINT> 。但是如果设置了SA_NODEFER 标记, 那么在该信号处理函数运行时,内核将不会阻塞该信号。 SA_NODEFER 是这个标记的正式的POSIX 名字( 还有一个名字SA_NOMASK ,为了软件的可移植性,一般不用这个名字)  SA_RESETHAND 当调用信号处理函数时,将信号的处理函数重置为缺省值。 SA_RESETHAND 是这个标记的正式的POSIX 名字( 还有一个名字SA_ONESHOT ,为了软件的可移植性,一般不用这个名字)  

  (3)  如果不需要重置该给定信号的处理函数为缺省值;并且不需要阻塞该给定信号( 无须设置sa_flags 标志) ,那么必须将sa_flags 清零,否则运行将会产生段错误。但是sa_flags 清零后可能会造成信号丢失!  

 

 

 

另外:

SIGCHLD

SIGCHLD属于unix以及类unix系统的一种信号

  产生原因 siginfo_t代码值   1,子进程已终止 CLD_EXITED   2,子进程异常终止(无core) CLD_KILLED   3,子进程异常终止(有core) CLD_DUMPED   4,被跟踪子进程以陷入 CLD_TRAPPED   5,子进程已停止 CLD_STOPED   5,停止的子进程已经继续 CLD_CONTINUED   描述:   在一个进程终止或者停止时,将SIGCHLD信号发送给其父进程。按系统默认将忽略此信号。如果父进程希望被告知其子系统的这种状态,则应捕捉此信号。信号的捕捉函数中通常调用wait函数以取得进程ID和其终止状态。

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值