2016-08-16 19 views
3

我編寫了一個終端應用程序,它使用由設計不佳的庫控制的設備,該庫覆蓋了SIGINT(CTRL + C)。我的目標是使用該庫正確使用該設備,但我希望能夠通過一些清理很好地關閉我的應用程序。 (否則,我也不會跟着我連接並再次運行程序時無法再連接其他設備的協議。)庫覆蓋信號處理程序,但我需要清理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; 
} 

然而,當我打CTRL + C,在badLibraryCall中註冊的另一個signalHandler被調用並退出。沒有好的doCleanUp完成。

+0

@ mike.dld,已更正。作爲解決方法,我使用了不同的信號。 – SpamBot

回答

1

很可能你的運氣了,除非你玩真的骯髒的把戲像using LD_PRELOAD覆蓋signalsigaction行爲時,你可以合理地推斷出你的壞庫在裏面。

但是,您可能能夠在單獨的進程中運行badLibraryCall,這是您的主進程的子進程。然後你的SIGINT陷阱可以收穫它,根據需要殺死,並執行你需要做的任何清理。