我想运行我的代码的一部分,但可以选择在它完全完成之前中断它(ctrl-c)并继续执行我的其余代码。 (我在 Linux 平台上工作。)
我的猜测是创建fork,调用方法,然后使用信号处理。信号处理需要哪些步骤?
void Manager::Run()
{
pid_t pID = fork();
if( pID<0 )
exit(1);//give up here
else if( pID==0 ) {
BuildList(); //I'd like the option to ctrl-c this only
//some code here catch user signal interrupt?
}
else {;}
waitpid(pID,NULL,0);//pause until BuildList() is done or interrupted
PrintList();
}
看起来我想在 if/else 部分的某处使用类似 signal(SIGINT,sigint) 的行。我需要定义一个这样的函数:
sigint(int param){ signal(param, SIG_DFL);};
除了我只想杀死子进程。
这是解决我的问题的正确想法吗?如果是这样,需要什么样的信号处理才能使其工作?
更新:
为了更完整地解决我的问题,我探索了建议的非 fork 方法。我应该能够在没有 fork 的情况下做到这一点似乎是合理的。不幸的是,由于我的几次尝试,我现在被困在编译错误上。我已经包含了更新的代码和新的错误。
在 Manager.hh
static void sighandler(int signum)
{
PrintList();
exit(1);
};
Manager.cc 包含
void Manager::Run()
{
signal(SIGINT,sighandler);//sets up sighandler()
BuildList(); //add elements to a list
signal(SIGINT,SIG_DFL); //restore default
PrintList();
}
如果 sighhandler 函数不是静态的,我会得到这个:
error: argument of type 'void (Manager::)(int)' does not match 'void (*)(int)'
在 Manager::Run() 中调用 signal(SIGINT,sighandler)
来设置处理程序。如果我在静态 sighandler 函数中调用 PrintList() 我得到这个:
error: cannot call member function 'void Manager::PrintList()' without object
在 sighandler() 中的 PrintList();
调用上。最后,我注意到使 PrintList() 成为一个静态函数(带有静态 sighandler),我在 List 和迭代器上得到这些错误以单步执行列表。
error: invalid use of member 'Manager::theList' in static member function
error: invalid use of member 'Manager::it' in static member function
有什么巧妙的方法可以解决这些错误?
最佳答案
根据您希望中断的功能,这可能无需 fork 即可实现。
如果函数在循环中进行处理,则信号处理程序可以设置一个 bool 值,指示您希望停止处理。循环可以只检查这个 bool 值,一旦由信号处理程序设置,该函数就可以安全地以一致的状态退出。
关于c++ - 中断方法但继续执行代码的其余部分,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5135707/