简单代码:
#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脚本中运行此代码,我需要在后台运行它。在这种情况下是否有可能以某种方式捕获信号?
答案 0 :(得分:3)
当您按ctrl-c
时,您将信号2(SIGINT)发送到当前进程(终端在前台运行的进程)。您可以使用kill
将信号发送到后台运行的流程(以&amp;开头):
$ kill -2 %%
当您说%%
时,您的意思是最后一个后台流程。当然你可以指定另一个。您需要知道它的PID(参见ps(1))或JobID(bash(1)/ jobs)。
我还要注意,您只能在具有作业管理的shell中使用%-notation(例如在bash
中)。当你不在这样的shell中时,你只能使用PID。
上次启动的流程的PID位于$!
。这在某些脚本中可能很有用。