分段故障信号处理程序sigint

时间:2016-03-26 23:32:31

标签: c signals fork

我想抓住SIGINT(CTRL + C)。 我希望当用户键入CTRL + C时它会终止子进程,但父进程将正常继续。 当我在我的程序中有子进程时它工作正常,但是当我没有子进程时,我得到"分段错误"。

我做到了:

void sig_handler(int signo);
//========================================
int main()
{
    // CTRL + C => SIGINT handler
    struct sigaction act;
    act.sa_handler = sig_handler;
    sigfillset(&act.sa_mask);
    act.sa_flags = 0;

    // Catch the signal
    sigaction(SIGINT, &act, NULL);
...
// done some checks and then fork a child.
} 

// SIGINT handler
void sig_handler(int signo)
{
 // dont know what to write here
}

1 个答案:

答案 0 :(得分:0)

我相信只需使用sigset()即可实现目标。

我会引用sigset手册页中的一些信息。

  

sigset()函数修改信号处理。 sig论点        指定信号,可以是除SIGKILL和SIGSTOP之外的任何信号。        disp参数指定信号的处置,可以是        SIG_DFL,SIG_IGN或信号处理程序的地址。如果sigset()是        used,disp是信号处理程序的地址,系统将sig添加到        在执行信号之前调用进程的信号掩码        处理程序;当信号处理程序返回时,系统恢复信号        调用进程的掩码到其传递之前的状态        信号。另外,如果使用sigset(),并且disp等于SIG_HOLD,        sig被添加到调用进程和sig的信号掩码中        性格保持不变。如果使用sigset(),则不使用disp        等于SIG_HOLD,sig从调用的信号掩码中删除        过程

请参阅此链接:sighold, sigignore, sigpause, sigrelse, sigset — legacy interface for signal management

您可以建立一个处理函数,当您获得SIGINT时将调用该函数。

void handler(int signo){
    // Here you can kill the child, if it exists
}

int main(int argc, char *argv[])
{
     ...
     sigset(SIGINT, handler);
     ...
}

希望对您有所帮助,如果您需要更多帮助,请在评论中提及。