这是"专家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 restartingn");
longjmp(jbuf,1);
}
return;
}
当我运行这个小程序时,它只是退出,我没有机会输入'Ctrl-C',如何修复这个小程序?
我想你用错函数了。当您使用信号时,应该是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 restartingn");
siglongjmp(jbuf,1);
}
return;
}
让它休眠,这样您就有机会键入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 restartingn");
longjmp(jbuf,1);
}
return;
}
另外,建议使用sigaction而不是signal
此程序在main
返回时退出,就像任何其他程序一样。