遇到SIGINT时重启程序的练习

时间:2014-06-06 05:40:55

标签: c sigint

这是"专家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?

3 个答案:

答案 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返回时退出,就像任何其他程序一样。