我正在尝试修改以下代码以使用sigaction()来拦截SIGINT;
我需要用“while(1)”替换“for”循环;你应该可以通过输入“^”来退出程序。(需要拦截SIGQUIT。)
#include <signal.h>
#include <unistd.h>
#include <iostream>
using namespace std;
void func ( int sig )
{
cout << "Oops! -- I got a signal " << sig << endl;
}
int main()
{
(void) signal ( SIGINT, func ); //catch terminal interrupts
//for ( int i = 0; i < 20; ++i )
while(1)
{
cout << "signals" << endl;
sleep ( 1 );
}
return 0;
}
答案 0 :(得分:0)
您可以使用sigaction
来捕获SIGINT
(并且仍然具有您已描述的输出),并使用以下代码(在Unix等操作系统上使用clang编译并适用于我) :
#include <signal.h>
#include <iostream>
#include <unistd.h>
static int sigcaught = 0;
static void sighandler(int signum)
{
sigcaught = signum;
}
int main()
{
int signum = SIGINT;
struct sigaction newact;
struct sigaction oldact;
newact.sa_handler = sighandler;
sigemptyset(&newact.sa_mask);
newact.sa_flags = 0;
sigaction(signum, &newact, &oldact);
while (!sigcaught)
{
std::cout << "waiting for signal" << std::endl;
sleep(1);
}
std::cout << "Oops! -- I got a signal " << sigcaught << std::endl;
return 0;
}
请注意:此代码故意不检查返回值(例如来自sigaction
或sleep
),因为原始代码不是,因为检查它们可能会损害读者从看到相关的差异。我不希望生产代码忽略返回值(特别是可以指示错误的那些)。