我一直在研究 Linux 中的信号。我已经做了一个测试程序来捕获 SIGINT。
#include <unistd.h>
#include <signal.h>
#include <iostream>
void signal_handler(int signal_no);
int main() {
signal(SIGINT, signal_handler);
for (int i = 0; i < 10; ++i) {
std::cout << "I'm sleeping..." << std::endl;
unsigned int one_ms = 1000;
usleep(200* one_ms);
}
return 0;
}
void signal_handler(int signal_no) {
if (signal_no == SIGINT)
std::cout << "Oops, you pressed Ctrl+C!\n";
return;
}
虽然输出如下所示:
I'm sleeping...
I'm sleeping...
^COops, you pressed Ctrl+C!
I'm sleeping...
I'm sleeping...
^COops, you pressed Ctrl+C!
I'm sleeping...
^COops, you pressed Ctrl+C!
I'm sleeping...
^COops, you pressed Ctrl+C!
I'm sleeping...
^COops, you pressed Ctrl+C!
I'm sleeping...
I'm sleeping...
I'm sleeping...
我知道当按下 Ctrl+C 时,前台进程组中的进程都会收到一个 SIGINT(如果没有进程选择忽略它)。
那么shell(bash)和上述程序的实例是否都收到了信号?每个“Oops”之前的“^C”来自哪里?
操作系统是 CentOS,外壳是 bash。