2013-07-09 52 views
2

我用我以同樣的方式應用在select()調用,它用在這裏: beej.us/guide/bgnet/examples/selectserver.c數據在處理選擇到達()

也就是說,我調用select(),遍歷所有文件描述符以處理數據,然後再次調用select()。但是,我想知道在循環和處理數據時到達的數據會發生什麼? select()會立即返回,還是會等到它看到新的數據?

問題的核心是,當有可用(舊)數據到recv(),或者是否等待新數據到達時,立即選擇返回嗎?

回答

1

如果有數據可用,select()立即返回。它不會等待更多數據到達。如果沒有數據,則會阻止並等待。

以某種方式,這必須是真實的,因爲具有O_NONBLOCK標誌的文件描述符永遠不會阻塞,但select()仍然可以工作。

+0

我做了一些更多的挖掘,人們說選擇是水平觸發的,而不是邊緣觸發的。這基本上是我所指的嗎? – user2562586

1

select通知您是否有數據要在套接字上讀取(在本例中)。它不在意當它到達,只有如果它在那裏。

所以你會從select無論如何得到一個返回指示。以類似的方式,您可能會發現,如果您在有5個字節的套接字上收到通知,而另一個5字節出現在返回的select和您呼叫read之間。在這種情況下,你會得到10個字節,但沒關係。它不會將這5個字節「攜帶」到下一個select