#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);书上这样写算怎么回事情呢?
----------------解决方案--------------------------------------------------------
应该是这样的,调试的时候忘记了改回来。请各位老大指教!
void handle(int s)
{
if(s==SIGINT)printf("信号还没有到达\n");
longjmp(buf,2);
}
----------------解决方案--------------------------------------------------------
函数名: 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;
}
----------------解决方案--------------------------------------------------------
函数名: 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()应该差不多*/
----------------解决方案--------------------------------------------------------
你说的我都知道,我问的是,为什么运行会出现错误,大哥
----------------解决方案--------------------------------------------------------
loop:
goto loop;
这里有什么意义??
其实我也不懂这个函数是怎样执行的,只想拿出来,大家瞧瞧,看别人怎么说.
----------------解决方案--------------------------------------------------------
先弄明白函数指针,signal的第2个参数是信号处理函数,当捕捉到指定信号时调用
----------------解决方案--------------------------------------------------------
#pragma inline
定义是什么意思啊
?
----------------解决方案--------------------------------------------------------
jmp_buf buf;
是什么意思?
----------------解决方案--------------------------------------------------------
loop:
goto loop;
要等信号,如果没有的话,程序就直接执行完了,signal的第一个参数是信号处理函数,第二个是函数.
在我的程序里运行的时候却是有错误,好象是返回不了.因为"信号还没有到达"这个可以打印出来!
----------------解决方案--------------------------------------------------------