我想运行一段代码,但可以选择在完全完成之前中断它(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);};
除了我只想杀死子进程。
这是解决我的问题的正确思路吗?如果是这样,需要进行哪些信号处理才能使其工作?
UPDATE:
为了更彻底地解决我的问题我研究建议非分叉的方法。没有叉子,我应该可以做到这一点似乎是合理的。不幸的是,我现在停留在几次尝试中的编译错误上。我已经包含更新的代码和新的错误。
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();
}
如果sighandler功能也不是一成不变的,我得到这样的:
error: argument of type 'void (Manager::)(int)' does not match 'void (*)(int)'
在管理器中调用signal(SIGINT,sighandler)
::运行()来设置处理程序。
如果我打电话的printList()在静态sighandler功能我得到这个:
error: cannot call member function 'void Manager::PrintList()' without object
在sighandler的PrintList();
()调用。
最后我注意到,使PrintList()是一个静态函数(带有一个静态sighandler),我得到这些错误列表和迭代器遍历列表。
error: invalid use of member 'Manager::theList' in static member function
error: invalid use of member 'Manager::it' in static member function
解决这些错误的任何聪明的方式?
我认为你应该在单独的问题中提出你的信号问题。如果您接受原始问题的答案,则可能更有可能得到回答。 – 2011-03-01 02:22:43