2011-05-20 19 views
2

在Linux系統上使用C套接字庫...accept()如何確定要返回哪個整數?

當我撥打accept()時,它總是返回一個整數。 STDIN爲0.通常,我的第一個接受調用返回3.它們在那之後遞增。

我想知道; accept()如何確定下一個整數?如果在另外兩個accept()呼叫之後,我將3,4和5分配給連接的客戶端; 4斷開連接時會發生什麼?下一個整數是4還是6?

如果有人可以對此有所瞭解,我一定會很感激。

回答

2

它採用了當前旁邊未打開的文件描述符,同爲open()和其他系統調用返回的文件描述符; dup2()是該模式的一個例外。 (文件描述符可能未打開,但仍可能無法重用,例如,如果它是網絡連接的一部分,但尚未完全清除)。更新:刪除文本恢復原始版本的如果一個文件描述符被關閉,它就可以重新使用,由於TCP/IP中的FIN-WAIT狀態,重新使用套接字地址可能存在問題 - 但是套接字地址不是文件描述符。)

如果你有描述1-5打開,然後關閉4,下一個開放式的操作將返回4.

可能有安全意識的系統中,這是不是模式,但它是不可能的。一個原因是,有正確的代碼來處理I/O重定向,它依賴於關閉標準輸入(文件描述符0)和下一個類似於文件描述符的開放式操作;重複標準輸出(文件描述符1)。

+0

那麼接下來的問題的情況下是「下一個未打開文件描述符」 4?還是6? – KeatsKelleher 2011-05-20 19:31:49

+3

我會寫「最低可用」,只是爲了更清楚。如果4關機()或遠程斷開連接,則它還不可用。如果4在本地close()d,則下一個open()/ accept()/將重用它(假設0-3正在使用)。 – ephemient 2011-05-20 19:34:16

+0

你們搖滾,謝謝! – KeatsKelleher 2011-05-20 19:35:06

0

它返回一個文件描述符接受套接字:

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. 

這給你一個數值,您可以用各種文件操作使用什麼樣的價值,並決定在幕後。

2

簡短的回答是,不要指望接受以任何預期的順序給你整數。無論你多麼容易誘惑,你認爲它會讓事情變成現實。

接受什麼是迴歸實際上是一個「描述」的內核資源,這將是描述符連接到所需的正確的驅動程序來讀取和寫入,關閉,尋求(如果可以)。可用描述符池是有限的,所以當你關閉一個套接字時,它的描述符會回到池中並可以被重用。

+0

+1某些調用,如'dup()',被記錄爲返回編號最小的可用描述符。我不認爲你可以依靠這個'accept()'。 – 2011-05-20 19:34:10

+1

0,1,2並不總是「被取走」,並且內核在「旋轉」一個新進程時(除PID 1外)不會分配任何東西。它們只是從父項繼承而來。因此,如果你寫'ls -l/dev/fd/<&- 2>&-',你會發現0和2與終端斷開連接(並且可能被'ls'重新用於讀取目錄列表)。 – ephemient 2011-05-20 19:40:11

+1

這個答案是錯誤的。最低可用分配是POSIX系統和所有經典Unices標準和100%可靠性的一部分。 – 2011-05-20 21:31:45

相關問題