我想运行我的代码的一部分,但可以选择在它完全完成之前中断它(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 functionerror: invalid use of member 'Manager::it' in static member function
有什么巧妙的方法可以解决这些错误?

最佳答案

根据您希望中断的功能,这可能无需 fork 即可实现。

如果函数在循环中进行处理,则信号处理程序可以设置一个 bool 值,指示您希望停止处理。循环可以只检查这个 bool 值,一旦由信号处理程序设置,该函数就可以安全地以一致的状态退出。

关于c++ - 中断方法但继续执行代码的其余部分,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5135707/

10-13 05:25