sigaction SIGINT,programm在shell中运行& (背景)没有得到信号

时间:2012-06-18 14:19:24

标签: c++ linux

简单代码:

#include <signal.h>
#include <stdio.h>
#include <unistd.h>
#include <iostream>

using namespaces td;                                                             
bool unblock = false;                                                  
long int ile = 0;                                                 

void ouch(int sig) {
    cout << "signal " <<  sig << endl;                               
    unblock = true;                                                  
}                                                                
int main(){                                                          
    struct sigaction act;                                           
    act.sa_handler = ouch;                                           
    sigemptyset(&act.sa_mask);                                  
    act.sa_flags = 0;                                             
    sigaction(SIGINT, &act, 0);                                    

    do {                                                         
        cout << "." << endl;                                         
    } while(!unblock);                                                          

    cout << "EXIT" << endl;                                          
}

现在我编译代码,我得到“a.out”。 当我像这样运行a.out时:

[przemek@localhost test]$ ./a,out

它按预期运行,当我按下CTRL + C时,程序会根据需要退出 但是当我运行这样的程序时(在我的项目中需要):

[przemek@localhost test]$ ./a.out&

os将控件传递给shell,我无法通过CTRL + C

打破循环

我需要在bash脚本中运行此代码,我需要在后台运行它。在这种情况下是否有可能以某种方式捕获信号?

1 个答案:

答案 0 :(得分:3)

当您按ctrl-c时,您将信号2(SIGINT)发送到当前进程(终端在前台运行的进程)。您可以使用kill将信号发送到后台运行的流程(以&amp;开头):

$ kill -2 %%

当您说%%时,您的意思是最后一个后台流程。当然你可以指定另一个。您需要知道它的PID(参见ps(1))或JobID(bash(1)/ jobs)。

我还要注意,您只能在具有作业管理的shell中使用%-notation(例如在bash中)。当你不在这样的shell中时,你只能使用PID。

上次启动的流程的PID位于$!。这在某些脚本中可能很有用。