关于遇到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 restartingn");
        longjmp(jbuf,1);
    }
    return;
}

当我运行这个小程序时,它只是退出,我没有机会输入'Ctrl-C',如何修复这个小程序?

我想你用错函数了。当您使用信号时,应该是sigsetjmpsiglongjmp。因为它们可以还原信号上下文

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

最新更新