C++ 库覆盖信号处理程序,但我需要在CTRL+;C

C++ 库覆盖信号处理程序,但我需要在CTRL+;C,c++,signals,C++,Signals,我编写了一个终端应用程序,它使用一个由设计糟糕的库控制的设备,该库覆盖了SIGINT(CTRL+C)。我的目标是使用该库正确地使用设备,但我希望能够通过一些清理很好地关闭我的应用程序。(否则,我将不会遵循连接到的其他设备的协议,并且在再次运行程序时无法重新连接。) 以下是我尝试过的: std::atomic< bool > globalQuit(false); void signalHandler(int signal) { globalQuit = true; } in

我编写了一个终端应用程序,它使用一个由设计糟糕的库控制的设备,该库覆盖了
SIGINT
(CTRL+C)。我的目标是使用该库正确地使用设备,但我希望能够通过一些清理很好地关闭我的应用程序。(否则,我将不会遵循连接到的其他设备的协议,并且在再次运行程序时无法重新连接。)

以下是我尝试过的:

std::atomic< bool > globalQuit(false);

void signalHandler(int signal)
{
    globalQuit = true;
}

int
main(int argc, char** argv)
{
    std::signal(SIGINT, signalHandler);
    badLibraryCall();
    while (!globalQuit)
    {
        badLibraryCall();
    }
    doCleanUp();
    return 0;
}
std::atomicglobalQuit(false);
无效信号处理器(int信号)
{
globalQuit=true;
}
int
主(内部argc,字符**argv)
{
std::信号(SIGINT,信号处理器);
badLibraryCall();
而(!globalQuit)
{
badLibraryCall();
}
doCleanUp();
返回0;
}

但是,当我点击CTRL+C时,调用并退出在
badLibraryCall
中注册的另一个信号处理程序。没有好的
doCleanUp

大多数情况下,除非你在可以合理推断出自己在坏库中时,玩一些非常肮脏的把戏,比如覆盖
signal
sigaction
行为


但是,您可以在单独的进程中运行
badLibraryCall
,该进程是主进程的子进程。然后你捕获的SIGINT可以收获它,根据需要杀死它,并执行你需要做的任何清理。

@mike.dld,被更正。我玩了不同的信号作为一个工作。