2017-02-23 88 views
0

在Linux中,socket()函數可能會失敗,並且EINPROGRESS是否可能?請注意,我特別詢問了socket(),而不是connect()或其他人。套接字()能否通過EINPROGRESS失敗

POSIX未列出EINPROGRESS作爲可能的錯誤代碼。但是,Linux中的socket()的聯機幫助頁說:

其他錯誤可能由基礎協議模塊生成。

是否有任何情況下該調用實際上可能會失敗EINPROGRESS

+0

我看不出如何。沒有什麼可以進行的。沒有涉及的I/O:只是創建一個套接字FD。你爲什麼要問? – EJP

+1

我認爲這裏的聯機幫助頁是明確的:可能有協議,實際上,_do_在調用socket()時返回'EINPROGRESS'。但是沒有一個常用的協議是這樣做的。那麼返回引用filedescriptor是不可能的,所以它必須是一個嚴重的錯誤,這與EINPROGRESS的含義有些衝突 – Ctx

回答

0

EINPROGRESS表示操作正在進行中。它會因爲外部原因而阻塞:等待遠程操作或本地設備。

socket()僅在系統內存中創建條目:沒有理由等待任何遠程動作或任何設備。

但是,如果它能夠返回EINPROGRESS,你就沒有什麼可以等待的。

使用文件句柄和套接字句柄,可以使用select()等待系統準備就緒。但是如果socket()本身沒有返回任何東西,那麼你沒有什麼可以等待的。

我沒有看到socket()返回EIPROGRESS的理由,但無論如何這將是一個壞主意。

0

也許不是你要找的答案:

你必須檢查相應的Linux kernel source codekernel/net/socket.c)throughly是100%肯定。瀏覽代碼,它看起來不像EINPROGRESS在任何地方返回。但是,在那裏有依賴於運行時的調用,所以很難說僅僅來自靜態代碼分析。