C++里面的signal函数的问题
用的是C++的控制台,想按下ctrl+c之后主函数可以重新开始而不是关闭掉程序,尝试了signal这个函数,的确是能做到了,可是现在有一个问题,就是我发现信号只能捕捉一次,在使用了一次,重新开始了主函数之后,却再也无法正常使用,下面贴代码
#include <signal.h>
#include <Windows.h>
#include <iostream>
using namespace std;
void cs(int n)
{ signal(SIGINT, cs);
int main();
if(n==SIGINT)
{cout<<"\n你按下了ctrl+c"<<endl;
main ();}
}
int main()
{ void cs(int n);
char ch;
cout<<"ab"<<endl;
signal(SIGINT, cs);
while(1)
{ cin>>ch;
Sleep(10);
if(cin.fail())
{cin.clear();
cin.sync();}
}
return 0;
}
各位大神可以拿到自己的电脑里面运行看看.. 我的signal函数是当程序接收到SIGINT信号时调用cs这个函数,然后我的cs函数的主要工作就是把signal函数再注册一遍,再调回主函数重新开始,但是我发现不能用第二遍,但是如果我不调回主函数..就不会有这个问题,想请教各路大神这是为什么?
(表达能力不太好,谢谢大家了!)
[解决办法]
用 goto 吧:
#include <signal.h>
#include <Windows.h>
#include <iostream>
using namespace std;
static int ctrl_c_pressed = 0;
void cs(int n)
{
signal(SIGINT, cs);
if(n==SIGINT)
{
cout<<"\n你按下了ctrl+c"<<endl;
ctrl_c_pressed = 1;
}
}
int main()
{
void cs(int n);
char ch;
main_start:
cout<<"ab"<<endl;
signal(SIGINT, cs);
while(1)
{
cin>>ch;
Sleep(10);
if(cin.fail())
{
cin.clear();
cin.sync();
if(ctrl_c_pressed)
{
ctrl_c_pressed = 0;
goto main_start;
}
}
}
return 0;
}