当前位置: 代码迷 >> C语言 >> 请教signal的问题
  详细解决方案

请教signal的问题

热度:429   发布时间:2006-09-05 10:01:36.0
有高手回答没.
----------------解决方案--------------------------------------------------------
signal函数的原型是void (* _Cdecl signal(int sig, void (*func)(/* int */))) (int);
首先,signal函数接受两个参数:一个是整型的信号,一个是指向用户定义的信号处理函数的指针,
而它的返回值是一个指向调用前的用户定义信号处理函数的指针。
也许用下面这种写法会让您容易更明白些:
typedef void (*Fun)(int);
Fun signal(int,Fun);
至于jmp_buf buf;在"setjum.h"里有如下定义:
typedef struct {
unsigned j_sp;
unsigned j_ss;
unsigned j_flag;
unsigned j_cs;
unsigned j_ip;
unsigned j_bp;
unsigned j_di;
unsigned j_es;
unsigned j_si;
unsigned j_ds;
} jmp_buf[1];
这个我没用过,也不清楚.
----------------解决方案--------------------------------------------------------

可能是操作系统的原因,因为我让朋友在LINUX的机子上试了,得到了我想要的答案.但是在WINDOWS上却得不到!!!


----------------解决方案--------------------------------------------------------
#pragma inline
定义是什么意思啊

jmp_buf buf;
是什么意思?
----------------解决方案--------------------------------------------------------
非要是这么定义的,在头文件里.至于为什么jmp_buf buf;我也不是很清楚,头文件里是这样,所以我也要写成这样
----------------解决方案--------------------------------------------------------

信号处理

UNIX(或其衍生系统)对信号的支持远比 DOS 要多,信号对之于DOS,可类比于中断(INT),
当某信号发生,转到信号处理函数执行,执行完毕后返回到转折点。

定义某信号的处理函数可使用 signal,使用 raise 函数向当前程序(线程)产生一个信号。
原型:
void (*signal(int sig, void(*func)(int sig[, subcode] ))) (int);
int raise(int signal);


明显地,signal 是事前的一个预备(信号 sig 就像Windows的消息,func 所指的函数就像消息映射的处理函数),而 raise 函数导致信号发生。
若 func 的值为SIG_DEF(常量指针),则执行系统默认的函数;若为 SIG_IGN 则忽略 sig 信号。

以下信号是 UNIX 及 DOS 的通用信号(ANSI),若设置为执行默认操作的话,它们都会导致程序被中止:
SIGABRT 异常中止时发生
SIGPPE 算术运算出错时发生
SIGILL 非法硬件指令
SIGINT 中止程序(Ctrl+C,纯DOS)
SIGSEGV 无效内存访问
SIGTERM 中止信号

以下是一个示例:

#include "stdio.h"
#include "conio.h"
#include "signal.h"

void PreExit(int);

int main(void)
{
puts("Press Ctrl+C Exit Program...");
signal(SIGINT, PreExit);

while('y' != getchar())
;

puts("Exiting...");
getch();

return 0;
}

void PreExit(int sig)
{
puts("Do you want to exit this program?('y'es)");
}


----------------解决方案--------------------------------------------------------

在我的程序里,他是识别出了信号,但是却没有实行跳转,就是longjmp(),出现了“不知道的软件异常错误”.但是我在UNIX下却得以实现,是否操作系统不同导致的呢?


----------------解决方案--------------------------------------------------------

在循环内设置一个输入,才可以响应 Ctrl+C 中断,
信号处理函数执行完毕后,还需要为退出循环做好准备,
这是因为中断后转到信号处理,处理完毕后返回到转折点(循环内),
这将继续无限循环。

loop:
if('y' == getchar()) /* 输入y结束程序 */
exit(0);
goto loop;


----------------解决方案--------------------------------------------------------
若需要关于异常处理的信息,可以联系本人。
----------------解决方案--------------------------------------------------------
老兄,你怎么联系呢?
----------------解决方案--------------------------------------------------------
  相关解决方案