在Linux系統上使用C套接字庫...accept()如何確定要返回哪個整數?
當我撥打accept()
時,它總是返回一個整數。 STDIN
爲0.通常,我的第一個接受調用返回3.它們在那之後遞增。
我想知道; accept()
如何確定下一個整數?如果在另外兩個accept()
呼叫之後,我將3,4和5分配給連接的客戶端; 4斷開連接時會發生什麼?下一個整數是4還是6?
如果有人可以對此有所瞭解,我一定會很感激。
在Linux系統上使用C套接字庫...accept()如何確定要返回哪個整數?
當我撥打accept()
時,它總是返回一個整數。 STDIN
爲0.通常,我的第一個接受調用返回3.它們在那之後遞增。
我想知道; accept()
如何確定下一個整數?如果在另外兩個accept()
呼叫之後,我將3,4和5分配給連接的客戶端; 4斷開連接時會發生什麼?下一個整數是4還是6?
如果有人可以對此有所瞭解,我一定會很感激。
它採用了當前旁邊未打開的文件描述符,同爲open()
和其他系統調用返回的文件描述符; dup2()
是該模式的一個例外。 (文件描述符可能未打開,但仍可能無法重用,例如,如果它是網絡連接的一部分,但尚未完全清除)。(更新:刪除文本恢復原始版本的如果一個文件描述符被關閉,它就可以重新使用,由於TCP/IP中的FIN-WAIT狀態,重新使用套接字地址可能存在問題 - 但是套接字地址不是文件描述符。)
如果你有描述1-5打開,然後關閉4,下一個開放式的操作將返回4.
可能有安全意識的系統中,這是不是模式,但它是不可能的。一個原因是,有正確的代碼來處理I/O重定向,它依賴於關閉標準輸入(文件描述符0)和下一個類似於文件描述符的開放式操作;重複標準輸出(文件描述符1)。
它返回一個文件描述符接受套接字:
RETURN VALUES
The call returns -1 on error and the global variable errno is set to
indicate the error. If it succeeds, it returns a non-negative integer
that is a descriptor for the accepted socket.
這給你一個數值,您可以用各種文件操作使用什麼樣的價值,並決定在幕後。
簡短的回答是,不要指望接受以任何預期的順序給你整數。無論你多麼容易誘惑,你認爲它會讓事情變成現實。
接受什麼是迴歸實際上是一個「描述」的內核資源,這將是描述符連接到所需的正確的驅動程序來讀取和寫入,關閉,尋求(如果可以)。可用描述符池是有限的,所以當你關閉一個套接字時,它的描述符會回到池中並可以被重用。
+1某些調用,如'dup()',被記錄爲返回編號最小的可用描述符。我不認爲你可以依靠這個'accept()'。 – 2011-05-20 19:34:10
0,1,2並不總是「被取走」,並且內核在「旋轉」一個新進程時(除PID 1外)不會分配任何東西。它們只是從父項繼承而來。因此,如果你寫'ls -l/dev/fd/<&- 2>&-',你會發現0和2與終端斷開連接(並且可能被'ls'重新用於讀取目錄列表)。 – ephemient 2011-05-20 19:40:11
這個答案是錯誤的。最低可用分配是POSIX系統和所有經典Unices標準和100%可靠性的一部分。 – 2011-05-20 21:31:45
那麼接下來的問題的情況下是「下一個未打開文件描述符」 4?還是6? – KeatsKelleher 2011-05-20 19:31:49
我會寫「最低可用」,只是爲了更清楚。如果4關機()或遠程斷開連接,則它還不可用。如果4在本地close()d,則下一個open()/ accept()/將重用它(假設0-3正在使用)。 – ephemient 2011-05-20 19:34:16
你們搖滾,謝謝! – KeatsKelleher 2011-05-20 19:35:06