这是"专家C编程"中的练习,我已经完成了,但它没有用。 该练习的要求如标题所示:
在程序中遇到SIGINT而不是简单地退出时重新启动程序。(在Linux中是Ctrl-C)
所以我的答案如下:
#include <signal.h>
#include <stdio.h>
#include <setjmp.h>
jmp_buf jbuf;
void handler(int sig);
main()
{
setjmp(jbuf);
signal(SIGINT,handler);
}
void handler(int sig)
{
if(sig==SIGINT)
{
printf("Program restarting\n");
longjmp(jbuf,1);
}
return;
}
当我运行此applet时,它只是退出,我没有机会输入&#39; Ctrl-C&#39;,如何修复applet?
答案 0 :(得分:2)
我认为你使用了错误的功能。使用signal时,它应该是 sigsetjmp 和 siglongjmp 。因为它们可以恢复信号上下文。
#include <signal.h>
#include <stdio.h>
#include <setjmp.h>
#include <unistd.h>
jmp_buf jbuf;
void handler(int sig);
int main()
{
sigsetjmp(jbuf,1);
signal(SIGINT,handler);
while(1){
}
return 0;
}
void handler(int sig)
{
if(sig == SIGINT)
{
printf("Program restarting\n");
siglongjmp(jbuf,1);
}
return;
}
答案 1 :(得分:1)
让它睡觉,所以你有机会输入ctrl-C。然后它工作正常:
#include <signal.h>
#include <stdio.h>
#include <setjmp.h>
#include <unistd.h>
jmp_buf jbuf;
void handler(int sig);
main()
{
setjmp(jbuf);
signal(SIGINT,handler);
sleep(15);
}
void handler(int sig)
{
if(sig==SIGINT)
{
printf("Program restarting\n");
longjmp(jbuf,1);
}
return;
}
此外,建议使用sigaction而不是signal。
答案 2 :(得分:0)
此程序在main
返回时退出,就像任何其他程序一样。