信号处理——sigaction

    sigaction是POSIX中的信号处理时的设置函数,一个接收到多个消息的进程,如何响应多个信号?需要解决以下四个问题(比前文的多两个)

 (1)处理函数每次使用之后都要被禁用吗?

 (2)如果SIGY消息再进程处理SIGX消息时,到达会发生什么情况?

 (3)如果进程再处理前一个SIGX消息时,另一个SIGX又来到会发生什么情况?

 (4)如果消息来到时,程序正在处理read类的输入而阻塞,那会如何?

 

先看代码:

/*

 ============================================================================

 Name        : sigaction_demo.c

 Author      : free

 Version     :

 Copyright   : Your copyright notice

 Description : Hello World in C, Ansi-style

 ============================================================================

 */

 

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

 

#include <signal.h>

#include <unistd.h>

 

 

#define SIZE 1000

 

void initHandler(int s)

{

printf("/ncalled signal with %d/n",s);

sleep(s);

printf("done handing signal %d/n",s);

 

}

 

int main(void) {

 

char input[SIZE];

 

sigset_t blocked;

 

struct sigaction newHandler;

 

newHandler.sa_handler = initHandler;

newHandler.sa_flags =  SA_RESTART;

 

sigemptyset(&blocked);

sigaddset(&blocked,SIGQUIT);

 

newHandler.sa_mask = blocked;//决定在处理一个消息时,是否要阻塞其他信号。

 

if((sigaction(SIGINT,&newHandler,NULL)) == -1)

{

perror("sigaction wrong!!");

}

else

{

while(1)

{

fgets(input,SIZE,stdin);

printf("intput = %s/n",input);

}

}

return EXIT_SUCCESS;

}

 

输入输出结果:

hel

intput = hel

 

^C

called signal with 2

^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^Cdone handing signal 2

 

called signal with 2

done handing signal 2

lo

intput = lo

 

^C

called signal with 2

^Cdone handing signal 2

 

called signal with 2

^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^/done handing signal 2

 

called signal with 2

done handing signal 2

退出

对于开头四个问题的结论:
(1)若再newHandler.sa_flags =  SA_RESETHAND | SA_RESTART;即加上SA_RESETHAND,则信号处理函数被关闭。在这种情况下连续输入两个crl+c,则程序被退出。
(2)如果SIGY是在    sigemptyset(&blocked);

                                       sigaddset(&blocked,SIGQUIT);

                                       newHandler.sa_mask = blocked;

被注明阻塞,则SIGY存放在阻塞队列中,直到其他非阻塞信号处理结束之后才执行。

(3)根据输入输出结果,很明显是第二个SIGX被忽略。

(4)先输入“hel”,之后再输入“lo”,最后结果输出“lo”。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值