私は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を受け取ることを理解しています(プロセスがそれを無視することを選択しない場合)。
それで、シェル(bash)と上記のプログラムのインスタンスの両方がシグナルを受信したのですか?各「おっと」の前の「^C」はどこから来ていますか?
OSはCentOSで、シェルはbashです。