您的位置:首页 > 其它

关于信号三种处理方式初步理解!

2016-04-13 21:20 381 查看
最近看APUE看到第十章信号,进程对信号的处理方式主要是三种:

1.忽略 2.终止 3.捕获

#include "apue.h"

static void

sig_int(int signo)        /* argument is signal number */

{

    puts("捕获了SIGINT");

}

int

main(void)

{

    int i;

    printf("%ld,%ld,%ld\n", SIG_IGN, SIG_DFL,signal(SIGINT, SIG_IGN或SIG_DFL或sig_usr));  

//忽略信号就是完全不进行任何响应,捕获信号后处理函数回返回结束一个pause继续执行,终止就是立刻中断退出。

//后台忽略终端的中断组合建,后台进程不接受ctrl-c是因为shell不把任何信号传送给进程,而不时改变了进程的SIGINT信号默认处理设置。

    for(i=0; i < 2; i++)                                               

        pause();

    exit(0);

}

    写了一个测试程序如上,不管前台运行还时后台运行,开头总是打印1,0,0。一开始百思不得其解,因为书上说shell会让后台进程忽略SIGINT信号,signal返回改变前的信号处理设置,那么如果后台运行不是应该打印1,0,1吗?怎么还打印1,0,0?最后搞懂了,shell让后台进程忽略SIGINT信号跟信号处理方式的忽略,此忽略非彼忽略,shell忽略键盘终端发送ctrl-c终端信号给后台进程,并不改变后台进程的默认的终止处理方式,所以1,0,0没有错,如果在shell命令下输入kill
-sigint 进程ID号 仍然时按终止的方式处理进程,但是键盘输入ctrl-c时没有任何响应的。

   由此例子,我又测试了三种处理方式,发现如果设置为忽略,那么发送SIGINT信号对进程没有任何干扰,始终暂停直到键入ctrl-\退出。如果设置为默认,因为SIGINT信号默认是终止进程,则进程跳过循环和pause()直接终止了。如果捕获信号设置处理函数sig_int()则第一次ctrl-c后输出"捕获了SIGINT",然后返回主函数继续暂停,而当再次键入ctrl-c后立刻终止了进程。表明处理函数执行返回后同时会让一个pause()返回进入下一次循环,两个次中断使得循环结束,程序执行正常终止。

  
最后我验证了一下把i<2改为i<3让循环次数增加一次,还是两个中断信号结束程序,由此印证了书上说法。signal的缺陷就是一次调用只能改变一次相应信号的处理方式,然后自动恢复。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: