2010-08-12 63 views
1

我在FTP實現中的打開的數據套接字上使用write()來發送文件。但在編寫一些數據之後,它已經掛了一段時間了;之後它將返回Broken pipe錯誤。任何幫助,將不勝感激。我的進程從一個buff讀取數據包並寫入套接字。我注意到這個問題增加了帶寬。如果我增加了要處理的數據包數量,那麼問題就來了。我正在使用FreeBSD。斷管錯誤

我使用兩個線程之一讀取數據包並寫入緩衝區......第二個線程從緩衝區中讀取這些數據包並寫入套接字。

感謝您的幫助 亞歷山大

+0

您尚未提供足夠的信息來診斷問題。一個好的起點是能夠證明問題的最小可編譯代碼片段。 – 2010-08-12 15:57:18

+0

我使用兩個線程讀取數據包並寫入緩衝區......第二個線程從緩衝區讀取這些數據包並寫入套接字。 – alexander 2010-08-12 16:25:04

+1

我不知道你爲什麼使用線程?通常程序只是讀取和寫入,使用非阻塞IO和輪詢或選擇。線程將*工作*,但爲種族和怪異的錯誤帶來如此多的機會... – 2010-08-12 22:03:19

回答

3

EPIPE可以被設置爲一個錯誤代碼,和/或SIGPIPE上調(取決於標誌),當您試圖寫入已關閉的文件描述符。連接的遠程端點很可能已關閉,並且您尚未檢查close/EOF事件(通常在poll/select ing或read/recv的返回值爲零時通過讀取事件返回)。

3

SIGPIPE當檢測到嘗試將數據寫入到損壞的管道時由內核發送到您的進程。例如,如果在寫入時接收方關閉了套接字,或者另一個線程意外關閉了套接字等,則可能發生這種情況。有很多可能的原因。大多數應用程序傾向於忽略此信號,並基於「write」返回碼來處理錯誤,因爲在SIGPIPE信號處理處理程序中沒有任何合理的選擇。基本上,將SIGPIPE處理程序設置爲SIG_IGN以便忽略它並查看來自「write」系統調用的可能返回代碼的列表並相應地處理它們。