sigaction函数及信号的处理方式

sigaction函数
1. 原型: int sigaction(int signum,const struct sigaction *act, struct sigaction *oldact);
2. 设置当一个进程收到一个信号的时候,所发生的动作。
3. 参数signum指定信号,但不能为SIGKILL和SIGSTOP。
   如果act非空,act就指定了对这个信号的处理方式,如果oldact非空,oldact就保存了之前这个信号的处理方式。
4. 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);
   };
5. 不要同时给sa_handler和sa_sigaction赋值,sa_restorer已经被废弃,不要使用这个元素。
    sa_handler指定了与信号signum相关的处理方式,可以取值: SIG_DEL,SIG_IGN,一个函数指针。
    sa_mask指定了在此信号的信号处理程序执行期间,所阻塞的信号。此外,如果没有在sa_flags中指定SA_NODEFER,此信号也会被自动阻塞。
    sa_flags: 可取的标志有:
        SA_NOCLDSTOP: 只对SIGCHLD有效,如果signum是SIGCHLD,当子进程停止(stop)或恢复执行(resume)的时候,调用进程不会收到通知。
只有当给SIGCHLD指定了一个信号处理程序的时候,这个标志才是有意义的。
        SA_NOCLDEAIT: 只对SIGCHLD有效, 如果signum是SIGCHLD,当子进程中止后,不会把子进程转换成僵尸进程。
只有给SIGCHLD指定了一个处理程序,或者为SIG_DEL时,此标志才有意义。
        SA_NODEFER: 如果指定了此标志,在执行这个信号的处理程序的时候,仍然可以接收此信号,而不会阻塞此信号。
只有为此信号设定一个处理程序的时候,此标志才有意义。
        SA_ONSTACK:  在sigalstack函数提供的栈上执行信号处理程序,如果指定的栈无效,就使用默认栈。
只有为此信号设定一个处理程序的时候,此标志才有意义。
        SA_RESETHAND:  如果此信号的信号处理程序被调用,就将信号的处理方式恢复为默认。
只有为此信号设定一个处理程序的时候,此标志才有意义。
        SA_RESTART:  只有为此信号设定一个处理程序的时候,此标志才有意义。  
        SA_SIGINFO: 如果指定了此标志,就使用sa_sigaction作为信号处理程序,而不是sa_handler.只有为此信号设定一个处理程序的时候,此标志才有意义。
6. fork出的子进程将继承父进程的信号处理方式。如果一个进程调用了execv,指定了信号处理程序的信号的处理方式将被重置为默认,指定为忽略的信号的处理方式仍然为忽略。
7.  如果一个进程忽略了SIGFPE,SIGILL,SIGSEV信号,一个进程的行为(整数除以0等)是未定义了。
8.  POSIX.1-1990禁止将SIGCHLD设置为SIG_IGN。POSIX.1-2001允许这种情况。忽略SIGCHLD能阻止产生僵尸进程。保证中止的子进程不会变成全局进程的唯一的可移植的方法是捕获这个信号并调用wait类函数。
9.  即使在sa_mask中指定了SIGKILL和SIGSTOP,也不会阻塞这两个信号。把函数的第二个参数为空,可以用来查询当前的信号处理方式。把第二个和第三个参数都指定为空,可以用来检查signum所指定的信号是否有效。
10. 成功返回0,出错返回-1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值