2017-06-14 61 views
1

我有一個析構函數,即使程序不正確地終止以確保外部進程死亡,也需要調用析構函數。退出或程序結束時執行函數

目前我已經註冊要調用的析構函數

std::atexit(killprocess); 
std::at_quick_exit(killprocess); 

然而,這意味着該方案已完成,但沒有終止時,進程沒有中止。有什麼方法可以確保killprocess或析構函數在退出或程序完成但未終止時調用?

編輯:完成但未終止的狀態來自visual studio,在最後添加了等待條件。我相信這意味着註冊kill process與atexit進程析構函數並不是在執行時自然被調用

+2

「完成但未終止」是什麼意思?你的意思是'main'返回和過程實際結束之間的時間? –

+0

調用killprocess作爲主要的最後一行 –

+0

如果我理解問題正確[std :: at_exit](http://en.cppreference.com/w/cpp/utility/program/atexit)實際上正在做你想做的事情: '註冊func指向的函數,在正常程序終止時(通過std :: exit()或從主函數返回)調用''。 –

回答

1

我認爲你問的是錯誤的問題。實際上,您的目標是找到一種方法來確保如果父流程死亡,外部流程就會死亡。但是在父進程中依靠一些函數調用是無法確保這一點的。父進程始終有可能陷入不一致的狀態,否則不可避免地無法調用這個清理函數。所以還有一些其他機制可以實現所需的行爲,例如處理子進程中的某些keepalive。例如,您可以從父進程提供管道,因此無論何種原因終止時,系統都會自動關閉父進程管道終端,並且子進程可以確定它需要退出。

1

應該在正常進程結束時調用由std :: atexit註冊的退出處理程序。如果情況並非如此,那麼你必須尋找其他地方。 請參閱std::atexit的文檔。也許你也想設置std::set_terminate處理程序。 某些程序結尾無法處理,所以如果你想確定,你必須求助於某種外部監控。評論中幾乎沒有想法。