| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1959 人关注过本帖
标题:请教signal的问题
只看楼主 加入收藏
lw8484654
Rank: 1
等 级:新手上路
帖 子:223
专家分:0
注 册:2005-12-1
收藏
得分:0 
有高手回答没.
2006-09-05 10:01
soft_wind
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:1430
专家分:0
注 册:2006-4-5
收藏
得分: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];
这个我没用过,也不清楚.

对不礼貌的女生收钱......
2006-09-05 16:44
lw8484654
Rank: 1
等 级:新手上路
帖 子:223
专家分:0
注 册:2005-12-1
收藏
得分:0 

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

2006-09-05 18:09
king_2345484
Rank: 1
等 级:新手上路
帖 子:41
专家分:0
注 册:2006-5-25
收藏
得分:0 
#pragma inline
定义是什么意思啊

jmp_buf buf;
是什么意思?

2006-09-05 21:34
lw8484654
Rank: 1
等 级:新手上路
帖 子:223
专家分:0
注 册:2005-12-1
收藏
得分:0 
非要是这么定义的,在头文件里.至于为什么jmp_buf buf;我也不是很清楚,头文件里是这样,所以我也要写成这样
2006-09-05 22:29
ChenMo
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:3
帖 子:481
专家分:10
注 册:2004-4-8
收藏
得分:0 

信号处理

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)");
}


欢迎加入 MVC 技术讨论群(新群:90093426)
2006-09-06 01:26
lw8484654
Rank: 1
等 级:新手上路
帖 子:223
专家分:0
注 册:2005-12-1
收藏
得分:0 

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

2006-09-06 08:30
ChenMo
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:3
帖 子:481
专家分:10
注 册:2004-4-8
收藏
得分:0 

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

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


欢迎加入 MVC 技术讨论群(新群:90093426)
2006-09-06 12:20
ChenMo
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:3
帖 子:481
专家分:10
注 册:2004-4-8
收藏
得分:0 
若需要关于异常处理的信息,可以联系本人。

欢迎加入 MVC 技术讨论群(新群:90093426)
2006-09-06 12:27
lw8484654
Rank: 1
等 级:新手上路
帖 子:223
专家分:0
注 册:2005-12-1
收藏
得分:0 
老兄,你怎么联系呢?
2006-09-06 13:02
快速回复:请教signal的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.061834 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved