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

最近看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_IGNSIG_DFLsig_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的缺陷次调用只能改变一次相应信号的处理方式,然后自动恢复



你可能感兴趣的:(关于信号三种处理方式初步理解!)