当前位置: 技术问答>linux和unix
关于signal函数的疑问
来源: 互联网 发布时间:2016-03-20
本文导语: 在书上看到一段代码 #include #include #include void ouch(int sig) { printf("OUCH! -O gpt sogma; %dn",sig); (void) signal (SIGINT,SIG_DFL); } int main() { (void) signal(SIGINT, ouch); while(1) { printf("Hello World!n"); sleep(1); } } 我想知道...
在书上看到一段代码
我想知道在我输入中断信号ctr+c的时候,程序为什么能捕获到?
也就是程序为什么能执行signal(SIGINT,ouch);这条语句.
程序不是一直在while循环里执行吗?怎么又会跳到上一行执行?
还有signal函数的定义是:void (*signal (intsig,void (*func)(int)))(int);
函数要带一个整型参数,可上面的代码并没有带啊(上面的代码signal和func都没带啊),这又是怎么回事呢?
#include
#include
#include
void ouch(int sig)
{
printf("OUCH! -O gpt sogma; %dn",sig);
(void) signal (SIGINT,SIG_DFL);
}
int main()
{
(void) signal(SIGINT, ouch);
while(1)
{
printf("Hello World!n");
sleep(1);
}
}
我想知道在我输入中断信号ctr+c的时候,程序为什么能捕获到?
也就是程序为什么能执行signal(SIGINT,ouch);这条语句.
程序不是一直在while循环里执行吗?怎么又会跳到上一行执行?
还有signal函数的定义是:void (*signal (intsig,void (*func)(int)))(int);
函数要带一个整型参数,可上面的代码并没有带啊(上面的代码signal和func都没带啊),这又是怎么回事呢?
|
signal函数在哪调用都没有关系,LINUX内核一直会监控信号
在你的进程里面一旦发出中断信号ctr+c,就中断你的进程。
在你的进程里面一旦发出中断信号ctr+c,就中断你的进程。
|
试着解答一下问题1:
在你的main函数里面,第一行是完成信号与函数的绑定,其后进入无限循环。
如果看一下微机原理,就可以大概知道中断的一个大体流程。不管是什么样的CPU,基本的地方都是相同的。中断向量表就是其中之一。中断向量表与中断类型一一对应,当对应类型的中断事件发生时,当中断发生的时候,你所建立的进程(此时正在进行无限循环)会被中断,程序计数器就会被指向对应的中断向量(或者说当前的程序会跳到对应中断向量的地址处),调用中断向量对应的一个函数,在这个函数中,会调用用户自己定义的函数,在这个例子里面就是你定义的并且在main函数中与SIG_INT进行了绑定的ouch函数。到这里的工作都是有操作系统和硬件共同来完成的,不受你的程序控制的。
对于问题2:
一般不用signal而用signal_action来进行绑定。
在你的main函数里面,第一行是完成信号与函数的绑定,其后进入无限循环。
如果看一下微机原理,就可以大概知道中断的一个大体流程。不管是什么样的CPU,基本的地方都是相同的。中断向量表就是其中之一。中断向量表与中断类型一一对应,当对应类型的中断事件发生时,当中断发生的时候,你所建立的进程(此时正在进行无限循环)会被中断,程序计数器就会被指向对应的中断向量(或者说当前的程序会跳到对应中断向量的地址处),调用中断向量对应的一个函数,在这个函数中,会调用用户自己定义的函数,在这个例子里面就是你定义的并且在main函数中与SIG_INT进行了绑定的ouch函数。到这里的工作都是有操作系统和硬件共同来完成的,不受你的程序控制的。
对于问题2:
一般不用signal而用signal_action来进行绑定。