linux 非可靠信号(31之前的信号)

1 当程序正在执行一个信号函数时,在函数执行期间,再次触发多个同样的信号,系统会保留一个
2 当程序正在执行一个信号函数时,在函数执行期间,再次触发一个不一样的信号,系统会暂停当前函数执行,跳转到新的信号
对应的函数去执行,执行完成后,才回到跳回之前所执行的函数中继续执行.
可以测试下面的程序
#include <stdio.h>
#include <string.h>

#include <unistd.h>

#include <signal.h>

#include <sys/time.h>

int g_iSeq=0;

 

void SignHandlerNew(int iSignNo,siginfo_t *pInfo,void *pReserved)

{
struct timeval tv;
gettimeofday( &tv, NULL );

 int iSeq=g_iSeq++;

    printf("%d Enter SignHandlerNew,signo:%d. time=%ld\n",iSeq,iSignNo,tv.tv_sec);

    sleep(10);      /*睡眠3秒钟*/
gettimeofday( &tv, NULL );

    printf("%d Leave SignHandlerNew,signo:%d  time=%ld\n",iSeq,iSignNo,tv.tv_sec);

}

 

int main(void)

{
 timeval tv;
gettimeofday( &tv, NULL );
    printf("process ID is %d,time is %ld\n",getpid(),tv.tv_sec);

    char szBuf[20];                                     /*输入缓冲区,长度为20*/

    int iRet;

    struct sigaction act;                               /*包含信号处理动作的结构体*/

    act.sa_sigaction=SignHandlerNew;                    /*指定信号处理函数*/

act.sa_flags=SA_SIGINFO;                            /*表明信号处理函数由sa_sigaction指定*/

    sigemptyset(&act.sa_mask);

    /*信号集处理函数(稍后进行介绍),将act.sa_mask所指向的信号集清空,*/

    

/*即不包含任何信号*/

    sigaction(SIGINT,&act,NULL);                        /* 注册SIGINT信号*/

    sigaction(SIGQUIT,&act,NULL);                       /* 注册SIGQUIT信号*/

 

  sleep(150);
gettimeofday( &tv, NULL );
    printf("process is over,time is %ld\n",tv.tv_sec);

 return 0;

}


发送信号:
[d5000@localhost testcode]$ kill -SIGINT 6624
[d5000@localhost testcode]$ kill -SIGINT 6624
[d5000@localhost testcode]$ kill -SIGINT 6624
[d5000@localhost testcode]$ kill -SIGINT 6624
[d5000@localhost testcode]$ kill -SIGINT 6624
[d5000@localhost testcode]$ kill -SIGQUIT 6624
[d5000@localhost testcode]$ kill -SIGQUIT 6624
[d5000@localhost testcode]$ kill -SIGQUIT 6624
[d5000@localhost testcode]$ kill -SIGQUIT 6624
[d5000@localhost testcode]$ kill -SIGQUIT 6624
[d5000@localhost testcode]$ kill -SIGINT 6624
[d5000@localhost testcode]$ kill -SIGINT 6624
[d5000@localhost testcode]$ kill -SIGINT 6624
接受:
[d5000@localhost testcode]$ ./sigaction
process ID is 6624,time is 1414548809
0 Enter SignHandlerNew,signo:2. time=1414548819
1 Enter SignHandlerNew,signo:3. time=1414548833
1 Leave SignHandlerNew,signo:3  time=1414548863
2 Enter SignHandlerNew,signo:3. time=1414548863
2 Leave SignHandlerNew,signo:3  time=1414548893
0 Leave SignHandlerNew,signo:2  time=1414548893
3 Enter SignHandlerNew,signo:2. time=1414548893
3 Leave SignHandlerNew,signo:2  time=1414548923
process is over,time is 1414548923
可以看到2,3信号各接受2个,也就是各自等待一个!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值