sigaction (2)

sigaction,是为替代signal 来设计的较稳定的信号处理。

 

signal的使用比较简单。signal(signalNO,signalproc);

 

而signaction,则可以设置比较多的消息。尤其是在信号处理函数过程中接受信号,进行何种处理。

 

使用示例为:

 

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


void WrkProcess(int nsig)
{
        printf("WrkProcess .I get signal.%d threadid:%d/n",nsig,pthread_self());


        int i=0;
        while(i<5){
                printf("%d/n",i);
                sleep(1);
                i++;
        }
}

int main()
{
        struct sigaction act,oldact;
        act.sa_handler  = WrkProcess;
//      sigaddset(&act.sa_mask,SIGQUIT);
//      sigaddset(&act.sa_mask,SIGTERM)
        act.sa_flags = SA_NODEFER | SA_RESETHAND;  
//        act.sa_flags = 0;

        sigaction(SIGINT,&act,&oldact);

        printf("main threadid:%d/n",pthread_self());

        while(1)sleep(5);

        return 0;
}

 

1)执行改程序时,ctrl+d,第一次不会导致程序的结束。而是继续执行,当用户再次执行ctrl+d的时候,程序采用结束。

 

2)如果对程序稍微进行一下改动,则会出现另外一种情况。

改动为:act.sa_flags = SA_NODEFER;

经过这种改变之后,无论对ctrl+d操作多少次,程序都不会结束。

 

3)下面如果再对程序进行一次改动,则会出现第三种情况。

 

For example:  act.sa_flags = 0;

在执行信号处理函数这段期间,多次操作ctrl+d,程序也不会调用信号处理函数,而是在本次信号处理函数完成之后,在执行一次信号处理函数(无论前面产生了多少次ctrl+d信号)。

如果在2)执行信号处理函数的过程中,再次给予ctrl+d信号的时候,会导致再次调用信号处理函数。

4)如果在程序中设置了sigaddset(&act.sa_mask,SIGQUIT);程序在执行信号处理函数的过程中,发送ctrl+/信号,程序也不会已经退出,而是在信号处理函数执行完毕之后才会执行SIGQUIT的信号处理函数,然后程序退出。如果不添加这项设置,则程序将会在接收到ctrl+/信号后马上执行退出,无论是否在ctrl+d的信号处理函数过程中。

 

 

原因如下:

1)情况下,第一次产生ctrl+d信号的时候,该信号被自己设定的信号处理函数进行了处理。在处理过程中,由于我们设定了SA_RESETHAND标志位,又将该信号的处理函数设置为默认的信号处理函数(系统默认的处理方式为IGN),所以在第二次发送ctrl+d信号的时候,是由默认的信号处理函数处理的,导致程序结束;

2)情况下,我们去掉了SA_RESETHAND了标志位,导致程序中所有的ctrl+d信号均是由我们自己的信号处理函数来进行了处理,所以我们发送多少次ctrl+d信号程序都不会退出;

3)情况下,我们去掉了SA_NODEFER标志位。程序在执行信号处理函数过程中,ctrl+d信号将会被阻止,但是在执行信号处理函数期发送的ctrl+d信号将会被阻塞,知道信号处理函数执行完成,才有机会处理信号函数执行期间产生的ctrl+d,但是在信号函数执行产生的多次ctrl+d,最后只会产生ctrl+d。2)情况下,由于设置了SA_NODEF,ctrl+d信号将不会被阻塞。所以能够并行执行下次的信号处理函数。

4)情况下,我们是设置了在执行信号处理函数过程中,我们将屏蔽该信号,当屏蔽该信号的处理函数执行完毕后才会进行处理该信号。

 

 

 

附:

当我们按下ctrl+c的时候,操作为:向系统发送SIGINT信号,SIGINT信号的默认处理,退出程序。

当我们按下ctrl+/的时候,操作为:向系统发送SIGQUIT信号,该信号的默认处理为退出程序。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值