我在Linux中有一個多線程的程序。我有興趣瞭解某些內存區域是否在特定時間段內寫入的。爲此,我只對這些內存頁面進行讀訪問,併爲SIGSEGV安裝信號處理程序。現在我的問題是,每個線程都會爲自己調用信號處理程序。說線程1寫入一些禁止的內存區域,是否會執行信號處理程序?是SIGSEGV傳遞給每個線程?
回答
所有
信號處置首先是進程範圍; 進程中的所有線程共享每個信號的相同配置。如果 一個線程使用sigaction()到 爲SIGINT, 建立處理程序,那麼可以從 調用該處理程序,以便傳送SIGINT爲 的任何線程。
但在
的信號讀取,可向任一 過程作爲一個整體或特定 螺紋。的信號,如果
其被作爲直接結果的特定 硬件指令的線程的 上下文中的執行的 產生螺紋定向(
SIGBUS, SIGFPE, SIGILL, and SIGSEGV
)
我從引用TLPI
。
不,根據問題標題。
對於問題主體:對於您要求的特定信號,是(否則:取決於)。導致段錯誤的線程將收到信號。
A signal may be generated (and thus pending) for a process as a whole (e.g.,
when sent using kill(2)) or for a specific thread (e.g., certain signals, such
as SIGSEGV and SIGFPE, generated as a consequence of executing a specific
machine-language instruction are thread directed [...].
爲什麼你說不,在描述中寫道SIGSEGV是線程定向的? – MetallicPriest
因爲問題是關於「to_each_ thread」。 'SIGSEGV'被傳遞給_one_線程(引起它的那個線程)。因此,沒有。 (但是,當然,如果沒有處理它,它可能(通常會)會殺死整個過程,這顯然會影響其他每個線程 - 但是信號不會傳遞給每個線程。) – Damon
標題中的問題沒有完全符合體內的問題;他們要求提供相同的底層信息,但對其中一個「否」對另一個是「是」。所以你可能想調整你的答案,以明確你說哪一個「不」。 – ruakh
- 1. 如何將新的FirefoxDriver實例傳遞給每個新線程?
- 2. 將每個列表項目逐一傳遞給新線程
- 3. 傳遞參數給線程
- 4. 將Edittext傳遞給線程
- 5. 傳遞參數給線程
- 6. 將參數傳遞給多個線程
- 7. C++傳遞對象給一個線程
- 8. 傳遞給多個線程的消息
- 9. 將上下文傳遞給多個線程是否安全?
- 10. POSIX線程和SIGSEGV
- 11. Android:將參數傳遞給線程
- 12. 如何將消息傳遞給線程
- 13. 將ZMQ上下文傳遞給線程
- 14. 將「this」傳遞給線程C++
- 15. 將靜態字段傳遞給線程
- 16. 將參數傳遞給Java線程
- 17. C++ //將Boost :: array傳遞給Boost ::線程
- 18. 將參數傳遞給線程
- 19. 將整數傳遞給線程
- 20. 將實例方法傳遞給線程
- 21. MVC3將ControllerContext傳遞給線程?
- 22. 將參數傳遞給線程
- 23. 將SQL連接傳遞給ActionListener(線程)
- 24. 將std :: string傳遞給本地線程
- 25. $。每個值都傳遞給函數
- 26. 如何讓每個線程傳遞另一個參數?
- 27. C#多線程服務器。將對象傳遞給主線程
- 28. Java多線程 - 將數據結構傳遞給線程
- 29. 如何將參數傳遞給c多線程中的線程
- 30. python線程 - 將參數傳遞給線程的最佳方式
這意味着SIGSEGV信號處理程序將由寫入禁止內存的線程執行,對吧? – MetallicPriest
@MetallicPriest是的,但它是所有線程相同的處理程序。 – cnicutar
它也取決於哪個線程稱爲mprotect?我認爲mprotect是針對整個過程的,對吧? – MetallicPriest