簡體   English   中英

c - 如何在多線程環境中處理SIGPIPE?

[英]c - How to handle SIGPIPE in a multithreaded environment?

我有一個用C編寫的多線程SSL服務器,其行為如下:

  • 主線程等待客戶端請求( epoll ),接受它們並為每個客戶端套接字生成一個分離的線程
  • 每個線程分別執行SSL_accept 成功進行SSL握手后 ,線程會從客戶端接收消息,並響應每個SSL_read的消息。
  • 客戶端關閉套接字或發生任何錯誤時,客戶端線程退出

我嘗試模擬並發客戶端連接來測試服務器。

在一次這樣的模擬中,我的服務器退出SIGPIPE信號。

有沒有辦法在線程級別捕獲和處理SIGPIPE 我希望相應的線程處理信號而不是整個進程退出。

最初我試過signal(SIGPIPE,SIG_IGN) ,但是信號(2)男人說:

signal()在多線程進程中的影響未指定。

signalfd可以用來處理這樣的SIGPIPEs嗎? 還是有其他解決方案嗎?

注意:服務器在Ubuntu 12.04上運行,我不能在send時使用MSG_NOSIGNAL ,因為我直接使用OpenSSL作為庫(沒有源代碼)

提前致謝。

有沒有辦法在線程級別捕獲和處理SIGPIPE? 我希望相應的線程處理信號而不是整個進程退出。

就在這里。 您需要阻止除一個線程之外的所有線程中的信號(在創建任何線程之前最好這樣做)。 如果你正在使用pthreads,你可以使用pthread_sigmask因為這將保證,在調用它之后,每個創建的線程都將繼承信號掩碼。 然后在一個特定的線程中,您需要使用sigaction注冊一個處理程序(不要使用signal ,它已經過時)。

當信號到達你的進程時它將被阻塞,直到這一個線程將繼續它的進程工作(只有那時信號被進程接收,這就是為什么它是未指定的行為 - 它取決於正在運行的線程,但通過阻止所有其他線程上的信號你指定哪個線程可以對它作出反應)。

其他方式:

如果你想永遠不接收這個信號並且知道哪個套接字被它破壞了,你只能使用pthread_sigmask並忽略所有線程的這個信號。 然后由於SIGPIPE而破壞的函數應該返回-1(我不熟悉openssl,但是當涉及到套接字時,它的write是說,套接字在另一邊關閉)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM