c的signal函数

signal函数的实现机制是通过改变中断向量表吗?有没有可以参考的为什么vc6调试的时候,没有中断的调用,改中断表好像是要调用某个中断吧在dos下是这样的吗?... signal函数的实现机制是通过改变中断向量表吗?
有没有可以参考的
为什么vc6调试的时候,没有中断的调用,改中断表好像是要调用某个中断吧
在dos下是这样的吗?
展开
 我来答
数字术士
推荐于2017-09-01 · 超过11用户采纳过TA的回答
知道答主
回答量:41
采纳率:0%
帮助的人:32万
展开全部
signal()是一种系统调用,用于通知运行时系统,当某种特定的“软件中断”发生时调用特定的程序。它的真正的名字应该是“Call_that_routine_when_this_interrupt_Comes_in(当该中断发生时调用那个程序)”,调用signal()函数,并通过参数传递告诉它终端类型以及用于处理中断的程序。ANSIC 标准中,signal()函数的声明如下:
void (*signal (int sig ,void (*func)(int))) (int) ;
函数返回与给定sig信号相关联的func的以前值
这个函数的模样很恐怖,它的意思是:
signal是一个函数,他返回一个函数指针,后者所指向的函数接受一个int参数并返回void 。
可以用typedef进行简化:
typedef void (*ptr_to_func) (int) ;
/*表示ptr_to_func是一个函数指针,该函数接受一个Int参数,并返回void */
ptr_to_func signal (int , ptr_to_func );

实例:捕捉段错误信号的信号处理函数:
#include <signal.h>
#include <stdio.h>
void handler(int s)
{
if (s == SIGBUS) printf(" now got a bus error signal\n");
if (s == SIGSEGV) printf(" now got a segmentation violation signal\n");
if (s == SIGILL) printf(" now got an illegal instruction signal\n");
exit(1);
}
main ()
{
int *p=NULL;
signal(SIGBUS, handler);
signal(SIGSEGV, handler);
signal(SIGILL, handler);
*p=0;
}
由于p是一个空指针,对空指针赋值会引发一个段错误,于是程序捕捉到SIGSEGV信号,并打印消息”now got a segmentation violation signal“后退出。
打开windows下的signal.h头文件,发现在这个头文件里定义了很多符号,但是没有找到SIGBUS,所以上面的代码在windows下编译不通过:
error C2065: 'SIGBUS' : undeclared identifier
把涉及到SIGBUS的相关部分删去即可。
使用setjmp、longjmp从信号中恢复:
#include <setjmp.h>
#include <signal.h>
#include <stdio.h>
jmp_buf buf;
void handler(int s)
{
if (s == SIGINT) printf(" now got a SIGINT signal\n");
longjmp(buf, 1);
/*NOTREACHED*/
}
main ()
{
signal(SIGINT, handler);
if (setjmp(buf)) {
printf("back in main\n");
return 0;
}else
printf("first time through\n");
loop:
/* spin here, waiting for ctrl-c */
goto loop;
}
慎重还可靠灬宝贝f
推荐于2017-10-10 · TA获得超过12.9万个赞
知道大有可为答主
回答量:1.9万
采纳率:52%
帮助的人:2675万
展开全部
  signal()是一种系统调用,用于通知运行时系统,当某种特定的“软件中断”发生时调用特定的程序。它的真正的名字应该是“Call_that_routine_when_this_interrupt_Comes_in(当该中断发生时调用那个程序)”,调用signal()函数,并通过参数传递告诉它终端类型以及用于处理中断的程序。ANSIC 标准中,signal()函数的声明如下:
void (*signal (int sig ,void (*func)(int))) (int) ;
函数返回与给定sig信号相关联的func的以前值
这个函数的模样很恐怖,它的意思是:
signal是一个函数,他返回一个函数指针,后者所指向的函数接受一个int参数并返回void 。
可以用typedef进行简化:
typedef void (*ptr_to_func) (int) ;
/*表示ptr_to_func是一个函数指针,该函数接受一个Int参数,并返回void */
ptr_to_func signal (int , ptr_to_func );

实例:捕捉段错误信号的信号处理函数:
#include <signal.h>
#include <stdio.h>
void handler(int s)
{
if (s == SIGBUS) printf(" now got a bus error signal\n");
if (s == SIGSEGV) printf(" now got a segmentation violation signal\n");
if (s == SIGILL) printf(" now got an illegal instruction signal\n");
exit(1);
}
main ()
{
int *p=NULL;
signal(SIGBUS, handler);
signal(SIGSEGV, handler);
signal(SIGILL, handler);
*p=0;
}
由于p是一个空指针,对空指针赋值会引发一个段错误,于是程序捕捉到SIGSEGV信号,并打印消息”now got a segmentation violation signal“后退出。
打开windows下的signal.h头文件,发现在这个头文件里定义了很多符号,但是没有找到SIGBUS,所以上面的代码在windows下编译不通过:
error C2065: 'SIGBUS' : undeclared identifier
把涉及到SIGBUS的相关部分删去即可。
使用setjmp、longjmp从信号中恢复:
#include <setjmp.h>
#include <signal.h>
#include <stdio.h>
jmp_buf buf;
void handler(int s)
{
if (s == SIGINT) printf(" now got a SIGINT signal\n");
longjmp(buf, 1);
/*NOTREACHED*/
}
main ()
{
signal(SIGINT, handler);
if (setjmp(buf)) {
printf("back in main\n");
return 0;
}else
printf("first time through\n");
loop:
/* spin here, waiting for ctrl-c */
goto loop;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
shbaiyxr
2012-08-23 · 超过30用户采纳过TA的回答
知道答主
回答量:107
采纳率:0%
帮助的人:57.1万
展开全部
signal函数的作用是设置信号中断,设置当某个信号到达时,执行特定函数,它可以说是只在这个程序执行期间有效
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式