[英]Getting SIGPIPE with non-blocking sockets — is this normal?
我在C中編寫一個基於epoll的網絡服務器。當我創建我的套接字以偵聽傳入連接時,我使用fcntl
進行非阻塞。 類似地,當傳入的連接從客戶端到達時,我在對它們執行任何操作之前使其套接字無阻塞,對於傳出連接的套接字也是如此。
有時我的服務器獲得一個SIGPIPE - 我想這是當我嘗試寫入客戶端已關閉的客戶端連接時。 這對我來說似乎很奇怪; 我認為使用非阻塞套接字而不是SIGPIPE,我應該從write
調用-1
和errno
ECONNRESET
獲得-1
。
有什么我想念的嗎? 或者即使使用非阻塞套接字同時獲得SIGPIPE和錯誤代碼也是正常的(這意味着我應該在我的設置中明確忽略帶signal(SIGPIPE, SIG_IGN)
)?
是的,這很正常。 如果您寫入另一端已關閉連接的套接字(非阻塞或非阻塞),您將獲得一個SIGPIPE
或(如果您阻止SIGPIPE
信號)錯誤返回( -1
),並將errno
設置為EPIPE
。
從手冊頁write
:
EPIPE
:fd
連接到讀取端關閉的管道或插座。 當發生這種情況時,寫入過程也將收到SIGPIPE
信號。 (因此,僅當程序捕獲,阻止或忽略此信號時才會看到寫入返回值。)
POSIX標准在這里: http : //pubs.opengroup.org/onlinepubs/009695399/functions/write.html並說:
[EPIPE]
嘗試寫入未打開以供任何進程讀取的管道或FIFO,或僅打開一端的管道或FIFO。SIGPIPE
信號也應發送給線程。
SIGPIPE是正常的。 除了為此目的設置信號處理程序旁邊的另一個選擇是在發送時使用標志MSG_NOSIGNAL。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.