2014-01-20 40 views
0

我有一個選擇在FDSET上運行,它包含幾個TCP連接和一個未綁定的UDP連接。在Windows中,當我關閉來自不同線程的UDP連接的套接字時,它將指示select返回。然而,在Ubuntu中,情況並非如此,爲什麼?爲什麼不關閉UDP套接字選擇返回?

+0

顯示代碼或我們無法清楚地知道什麼正在關閉。也是你選擇一個FD數組的選擇? (文件描述/套接字) – nrathaus

+0

:「在同一進程的其他線程中可能正在使用系統調用時關閉文件描述符可能不明智,因爲文件描述符可能會被重用,所以會出現一些模糊的競爭可能會導致意外副作用的條件「 –

+0

@ KarolyHorvath指出,但這似乎並不是問題。套接字關閉的時間似乎並不重要。 – chacham15

回答

2

如果這取決於您是否想的select(和FD_SET)之前,期間的select,或關閉FD 。在這兩種情況下,由於下面列出的原因,行爲是不確定的。也許它在Windows下做了一件事,但你不能依賴它。

如果你想在關閉FD select(即後select()系統調用已經進入,但在返回之前),則行爲是未定義設置在這裏的原因:What does select(2) do if you close(2) a file descriptor in a separate thread?

如果您試圖關閉select(和FD_SET)之前的fd ,那麼您正嘗試在現在已關閉即FD無效的FD上嘗試FD_SET然後select()。標準在這裏:http://pubs.opengroup.org/onlinepubs/009695399/functions/select.html並且這表示FD_SET宏可能甚至不會要求select()查看您的FD。

如果fd參數是小於0 或大於或等於FD_SETSIZE,或者如果fd是不是有效的 文件描述符,或者如果任何參數與表達這些宏的行爲是不明確方 的影響。

如果它(且僅當它),select應該返回EBADF

在下列情況下,PSELECT()和select()失敗,將 errno設置爲:

[EBADF]一個或多個文件描述符集指定了一個不是有效的打開文件描述符的文件描述符 。

但是你沒有辦法知道情況會如此,因爲FD_SET可能同樣只是忽略無效的文件描述符。

爲了完整性,如果您在close之前執行FD_SET,但之後再執行select,則應該看到EBADF

+0

不,FD的關閉與我按下按鈕有關。因此,我100%確定在選擇電話時FD是有效的。 – chacham15

+0

所以當你關閉fd時,它在* select()中?在這種情況下,'select()'本身的行爲不是由POSIX標準定義的(請參閱我發送的鏈接)。它可能會返回它,它可能不會。請參閱:http://stackoverflow.com/questions/543541/what-does-select2-do-if-you-close2-a-file-descriptor-in-a-separate-thread – abligh

+0

據我所知,這鏈接中沒有提到關於調用後關閉的套接字。我錯過了什麼? – chacham15

相關問題