我正在開發一個庫,在這裏我將各種任務分配給某些第三方庫,這些庫執行一些相對簡單或危險的平臺特定工作。 (具體來說,我正在編寫一個調用JIT編譯器的數學函數解析器,例如LLVM或libjit來構建機器代碼。)實際上,這些第三方庫有崩潰的傾向(部分原因是我的錯當然,但我仍然想要一些保險)。如何將工作/線程與崩潰隔離
因此,我希望能夠非常優雅地處理一個可怕的工作--SIGSEGV,SIGILL等 - 而不會將我的其他代碼(或者用戶的代碼庫函數)。要清楚的是,我不在乎這個特定的工作是否能夠繼續下去(我不會試圖修復崩潰的情況),在這樣的崩潰之後,我也不關心這些對象的狀態(我會放棄他們立即如果有崩潰)。我只希望能夠檢測到發生了崩潰,停止崩潰取出整個過程,停止調用任何崩潰並恢復執行。我們只需要執行continue;
就可以了,並且可以繼續進行下一步操作(對於更多的上下文,此時的代碼是一個for循環,用於測試每個可用的JIT編譯器,其中一些編譯器可能會崩潰,如果他們這樣做,我只想執行continue;
並繼續與測試另一個編譯器)。
目前,我有一個基於signal()
的實現失敗非常可怕;當然,信號處理程序中的信號處理程序對longjmp()
是未定義的行爲,並且信號處理程序幾乎預計以exit()
或terminate()
結束。只是把代碼扔到另一個線程本身並沒有幫助,至少我迄今爲止測試過它的方式。我也無法破解一種使用C++異常來完成這項工作的方法。
那麼,隔離一組特定指令/線程/作業與崩潰的最佳方式是什麼?
這是做到這一點的唯一方法。一個線程會在進程中的任何地方損壞內存,所以在SEGV之後,你不能保證你的內存不受影響。 – KeithB 2010-08-24 16:15:39
感謝您的提醒。這裏幾乎肯定是正確的答案。我要閱讀fork()和company。 – 2010-08-25 18:54:18