我想抓住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
}
答案 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);
...
}
希望对您有所帮助,如果您需要更多帮助,请在评论中提及。