c的signal函数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c的signal函数相关的知识,希望对你有一定的参考价值。

signal函数的实现机制是通过改变中断向量表吗?
有没有可以参考的
为什么vc6调试的时候,没有中断的调用,改中断表好像是要调用某个中断吧
在dos下是这样的吗?

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;
参考技术A   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;
参考技术B signal函数的作用是设置信号中断,设置当某个信号到达时,执行特定函数,它可以说是只在这个程序执行期间有效

signal函数 问题,,,怎么让函数地址还传参

我写一下~还是不太会啊。。。
其实我做的函数不是返回int的,是返回指向结构体的指针的:
struct clock (*modify_special( int x)); //全局变量中定义了一个结构体--clock,这个函数 返回指向结构体的指针
在主函数里要用signal调用
struct clock (*(*fp))(int);
fp=modify_clock;
signal (SIGQUIT, fp)

由于fp仅仅是函数指针 换言之 仅仅是个地址 如果你需要传参数的话 只能扩充signal函数的参数 然后在signal函数体里 用fp调用传给signal的参数----你能帮我写一下么?真的不太知道怎么写!谢谢你!!

参考技术A signal(SIGUIT,fp,intforfp)

fp(intforfp);

以上是关于c的signal函数的主要内容,如果未能解决你的问题,请参考以下文章

c语言标准函数库的signal.h

signal函数 问题,,,怎么让函数地址还传参

函数指针玩得不熟,就不要自称为C语言高手(函数指针是解耦对象关系的最佳利器,还有signal)

函数指针的转换 & C的注意点

C语言alarm()函数(延时一段时间执行signal SIGALRM信号处理事件)

Linux 环境下的C语言, 关于 kill 发送信号和 signal() 函数, 具体问题在以下代码的注释处