2016-03-26 45 views
0

我想捕获SIGINT(CTRL + C)。 我希望当用户键入CTRL + C它会杀死子进程,但父进程将正常继续。 当我在我的程序中有子进程时它工作正常,但是当我没有子进程时,我得到“分段错误”。分段故障信号处理程序sigint

我已经这样做了:

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

分叉你的子进程之前获取当前的进程ID,然后把它分叉你的孩子并获得它的进程ID,然后当处理信号时检查ctrl c是否为父进程ID,然后根据它实现你的逻辑。 – FZE

+0

你在哪行代码中得到了分段错误? –

回答

0

我相信,刚刚通过sigset(),您可以实现自己的目标。

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

sigset()函数修改信号处置。 sig参数 指定信号,它可以是除SIGKILL和SIGSTOP以外的任何信号。 disp参数指定信号的配置,可能是 SIG_DFL,SIG_IGN或信号处理程序的地址。如果使用sigset()为 ,并且disp是信号处理程序的地址,则系统在执行信号处理程序之前将调用进程的信号掩码添加到 ;当信号处理程序返回时,系统将调用进程的掩码恢复到其在发送信号之前的状态。另外,如果使用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); 
    ... 
} 

希望它可以帮助你,如果你需要更多的帮助,只需在评论中提及它。

+0

请注意,如果答案解决了您的问题。 - 谢谢 – shahharshil46