我試圖在C++/Linux中實現一個定期從終端接收用戶輸入的服務器。最初我已經實現了兩個獨立的線程來處理這種行爲。但是我意識到,如果用戶想關閉服務器,我需要像pthread_cancel這樣的取消服務器線程。我可以使用select來結合stdin和accept嗎?
然後我決定在同一個線程中處理兩個動作可能會更好,所以我不必擔心資源泄漏。所以我現在有一個'select'調用,它可以選擇stdin fd以及我接受的fd。我的代碼看起來像這樣...
fdset readfds;
FD_SET(acceptfd, &readfds);
FD_SET(stdinfd, &readfds);
while(1) {
select(n, &readfds, NULL, NULL, NULL);
....
}
由於某種原因,我不再能夠讀取來自stdin的輸入。這工作正常,當我從我的fd集合中刪除兩個fds中的任何一個時,其他ome按預期執行。但是,當我將它們都放入時,acceptfd仍然接受傳入連接,但stdinfd無法響應終端輸入。
有沒有人知道我可能會在這裏做錯嗎?這種方法本質上是否有缺陷?我是否應該專注於將這兩項行動作爲單獨的線索並找出一種乾淨地退出的方式?
感謝您的閱讀!
這絕對是可能的muliplex標準輸入和聽FD。究竟發生了什麼?在中間插入一些printf來查看。很可能您忘記將文件描述符設置爲非阻塞模式,而您的read()或accept()塊將不會立即返回。 – 2012-07-28 21:38:33