2016-07-14 185 views
-2

我已經在線閱讀了一些關於套接字編程的資料。默認情況下,write()被阻止。在某些材料中,當套接字緩衝區已滿時,write()僅會阻止。一些其他材料說write()被阻塞,直到用戶緩衝區中的所有數據已被移動到系統緩衝區,這意味着如果沒有足夠的空間放置數據,則write()也會被阻止。我想知道如果write()設置爲阻止哪個語句是正確的。非阻塞式寫入c

+0

是哪個插座?視窗? –

+1

@o_weisman感謝您的回覆。 Linux系統。 – HuangJie

+0

我建議你將問題的操作系統添加爲標籤。 – sjsam

回答

0

當描述符是套接字時,write函數的行爲與send()函數類似。如果內部緩衝區已滿並且可以發送所有數據,write()函數將會阻塞。這假定套接字被阻塞。請記住,寫入功能可能會被信號中斷; errno將被設置爲EINTR(返回值將是捕獲信號時寫入的字節數),並且可以再次調用write()直到發送所有數據。

參見

http://pubs.opengroup.org/onlinepubs/009695399/functions/write.html http://pubs.opengroup.org/onlinepubs/009695399/functions/send.html

+0

在上面發佈的send()函數的鏈接上,它表示如果發送套接字上的空間不可用來保存要發送的消息,並且套接字文件描述符沒有設置O_NONBLOCK,則send()應該阻塞直到空間可用。所以也許這就是你正在尋找的答案。至於「直到所有數據都可以發送」我寫道,我的意思是說,直到所有傳遞給write()函數的數據都寫入內部緩衝區。我爲寬鬆的語言表示歉意,並不是要誤導你。 –

1

在一些材料,寫()只塊時插座緩衝區已滿。其他一些材料說write()被阻塞,直到用戶緩衝區中的所有數據都被移動到系統緩衝區,這意味着如果沒有足夠的空間放置數據,write()也會被阻塞。

我不清楚這些實際上是在說什麼不同的東西。

首先,被稱爲「系統緩衝區」的是另一個被稱爲「套接字緩衝區」的東西,但它們是相同的東西。其次,當第一條語句表示「write()僅在套接字緩衝區已滿時阻塞」時,應將其解釋爲「write()僅在寫入操作溢出(系統)緩衝區時阻止」。這與「write()被阻塞直到用戶緩衝區中的所有數據已被移動到系統緩衝區」相同。它只是說一個條件會導致write()被阻塞,另一個說該條件會在條件變爲false時停止。這並不矛盾。