| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1957 人关注过本帖
标题:请教signal的问题
只看楼主 加入收藏
lw8484654
Rank: 1
等 级:新手上路
帖 子:223
专家分:0
注 册:2005-12-1
收藏
 问题点数:0 回复次数:23 
请教signal的问题

#include<stdio.h>
#include<signal.h>
#include<setjmp.h>
jmp_buf buf;
void handle(int s)
{
if(i==SIGINT)printf("信号还没有到达\n");
longjmp(buf,2);
}
void main()
{
signal(SIGINT,handle);
int i=setjmp(buf);

if(i!=0){printf("the signal's return value:%d\n",i);}
else {printf("I will go handle\n");}

//在这里循环等待,直至输入Ctrl+c.
loop:
goto loop;
}
请问为什么输入了ctrl+c后,结果是read错误呢?这个signal到底是怎么回事情呢?特别是第一个函数。什么时候该用什么呢?
signal(int, void (__cdecl *)(int))函数的原形是这个。signal(SIGINT,handle);书上这样写算怎么回事情呢?

搜索更多相关主题的帖子: signal 
2006-09-04 20:57
lw8484654
Rank: 1
等 级:新手上路
帖 子:223
专家分:0
注 册:2005-12-1
收藏
得分:0 
应该是这样的,调试的时候忘记了改回来。请各位老大指教!
void handle(int s)
{
if(s==SIGINT)printf("信号还没有到达\n");
longjmp(buf,2);
}
2006-09-04 21:01
nuciewth
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:我爱龙龙
等 级:贵宾
威 望:104
帖 子:9786
专家分:208
注 册:2006-5-23
收藏
得分:0 

函数名: signal
功 能: 设置某一信号的对应动作
用 法: int signal(int sig, sigfun fname);
程序例:

/* This example installs a signal handler routine for SIGFPE,
catches an integer overflow condition, makes an adjustment
to AX register, and returns. This example program MAY cause
your computer to crash, and will produce runtime errors
depending on which memory model is used.
*/

#pragma inline
#include <stdio.h>
#include <signal.h>

void Catcher(int sig, int type, int *reglist)
{
printf("Caught it!\n");
*(reglist + 8) = 3; /* make return AX = 3 */
}

int main(void)
{
signal(SIGFPE, Catcher);
asm mov ax,07FFFH /* AX = 32767 */
asm inc ax /* cause overflow */
asm into /* activate handler */

/* The handler set AX to 3 on return. If that hadn't happened,
there would have been another exception when the next 'into'
was executed after the 'dec' instruction. */
asm dec ax /* no overflow now */
asm into /* doesn't activate */
return 0;
}


倚天照海花无数,流水高山心自知。
2006-09-04 21:04
nuciewth
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:我爱龙龙
等 级:贵宾
威 望:104
帖 子:9786
专家分:208
注 册:2006-5-23
收藏
得分:0 

函数名: longjump
功 能: 执行非局部转移
用 法: void longjump(jmp_buf env, int val);
程序例:

#include <stdio.h>
#include <setjmp.h>
#include <stdlib.h>

void subroutine(jmp_buf);

int main(void)
{

int value;
jmp_buf jumper;

value = setjmp(jumper);
if (value != 0)
{
printf("Longjmp with value %d\n", value);
exit(value);
}
printf("About to call subroutine ... \n");
subroutine(jumper);

return 0;
}

void subroutine(jmp_buf jumper)
{
longjmp(jumper,1);
}

/*你的handle函数和这里的subroutine()应该差不多*/


倚天照海花无数,流水高山心自知。
2006-09-04 21:13
lw8484654
Rank: 1
等 级:新手上路
帖 子:223
专家分:0
注 册:2005-12-1
收藏
得分:0 
你说的我都知道,我问的是,为什么运行会出现错误,大哥
2006-09-04 21:26
nuciewth
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:我爱龙龙
等 级:贵宾
威 望:104
帖 子:9786
专家分:208
注 册:2006-5-23
收藏
得分:0 
loop:
goto loop;

这里有什么意义??

其实我也不懂这个函数是怎样执行的,只想拿出来,大家瞧瞧,看别人怎么说.

倚天照海花无数,流水高山心自知。
2006-09-04 21:39
论坛
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:1372
专家分:0
注 册:2006-3-27
收藏
得分:0 
先弄明白函数指针,signal的第2个参数是信号处理函数,当捕捉到指定信号时调用

日出东方,唯我不败! 做任何东西都是耐得住寂寞,任何一个行业要有十年以上的积累才能成为专家
2006-09-04 21:49
king_2345484
Rank: 1
等 级:新手上路
帖 子:41
专家分:0
注 册:2006-5-25
收藏
得分:0 
#pragma inline
定义是什么意思啊


2006-09-04 21:50
king_2345484
Rank: 1
等 级:新手上路
帖 子:41
专家分:0
注 册:2006-5-25
收藏
得分:0 
jmp_buf buf;
是什么意思?

2006-09-04 22:20
lw8484654
Rank: 1
等 级:新手上路
帖 子:223
专家分:0
注 册:2005-12-1
收藏
得分:0 
loop:
goto loop;
要等信号,如果没有的话,程序就直接执行完了,signal的第一个参数是信号处理函数,第二个是函数.
在我的程序里运行的时候却是有错误,好象是返回不了.因为"信号还没有到达"这个可以打印出来!
2006-09-04 22:37
快速回复:请教signal的问题
数据加载中...
 
   



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

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