2011-04-11 45 views
2

有沒有辦法讓'select'等待讀取和寫入,同時也能夠添加新的文件描述符?最好在一個線程上?C++ select異步編程

+0

如果你只有一個線程,那麼誰是增加新的文件描述符? – 2011-04-11 20:06:48

+0

@Oli:我想OP只是想取消'select'調用並在另一個調用'select'之前添加描述符。 – 2011-04-11 20:09:52

+1

@Andre:但只有一個線程,*何時*他想要打破「選擇」?有一些外部刺激嗎? – 2011-04-11 20:11:22

回答

2

現在我知道你的場景是什麼(一個基於套接字的服務器可能想接受新的傳入連接),你知道你可以將你的監聽套接字的文件描述符追加到select的列表中嗎?見例如http://www.lowtek.com/sockets/select.html

(意譯例如:)

fd_set socks; 

FD_ZERO(&socks); 

// Add listener socket 
listen(sock, n); 
FD_SET(&socks, sock); 

// Add existing socket connections 
for (i = 0; i < num_existing_connections; i++) 
{ 
    FD_SET(&socks, connection[i]); 
} 

// Will break if any of the existing connections are active, 
// or if a new connection appears. 
select(..., &socks, ...); 
+0

該網站是非常有幫助的。謝謝! – Andrew 2011-04-11 20:54:51

3

據我所知,你可以在同一個線程中做,但不能在同一時間。在這樣的問題中,我通常在描述符列表中添加我的虛擬回送套接字,並且每當我必須在FD_LIST中添加一個新的套接字時,我只是向我的虛擬套接字發送一個字節,並打破了選擇循環。然後我可以更新FD_LIST,然後再次選擇繼續。

+0

您還可以使用最後一個參數向'select'調用添加超時。 – 2011-04-11 20:11:43

+0

當然可以。但在這種情況下,如果您在選擇中使用較長的時間間隔,則必須等到新的套接字添加到FD_LIST中。如果在select中使用非常短的時間間隔,或者您不需要立即添加套接字,那麼使用interval參數是不錯的選擇。 – Tayyab 2011-04-11 20:17:40