2012-12-10 124 views
2

在我的應用程序中,當報警觸發時,我從信號處理程序向管道寫入一個整數。 在我的主要應用程序中,我永遠循環選擇()與0超時值。 問題在於信號處理程序成功寫入到管道的寫入端,但是選擇從不顯示管道讀取端的可讀性。因此,在下面的僞代碼中,select中的返回值應該爲0. 即使更復雜的是,如果我刪除select並簡單地執行阻塞read(),它就會工作!我可以讀取處理程序寫入的整數。這僅僅是選擇一直認爲,管道的讀端無法讀取,因此始終返回0選擇無法正常工作

所以pseduo代碼看起來像

int x=0; 
for(;;) 
{ 

    x = select(maxfd, &readfd, NULL, NULL, &dontWait); // dontWait is timeval with tv_sec and tv_usec = 0 
    if (x == 1) 
    //check for read descriptor and do something 
} 
+2

我從未想過我會去用這個當有人居然說'select'被打破:選擇不破( http://www.codinghorror.com/blog/2008/03/the-first-rule-of-programming-its-always-your-fault.html) –

+0

@BrianRoach它更像是一個英語問題。在解決了這個問題幾個小時之後,到了晚上,我真的沒有想到比我的選擇無法工作的更好的標題。我真正的意思是我的選擇在我的上下文中的使用,當然不是那個選擇被打破了 – Jimm

+0

對不起,它意味着比其他任何事情更開玩笑/開玩笑。我的意思是沒有進攻。 –

回答

6

select功能修改兩個集和超時。在調用select之前,您必須重新初始化描述符集並超時循環的每次迭代。

此外,你不應該使用if (x == 1),但使用if (FD_ISSET(some_fd, &readfd))。並且請記住maxfd應該是任何集合中使用的最大文件描述符加上一個

+0

謝謝,通過重新初始化描述符集,問題解決了!重新初始化描述符集的基本原理是什麼? – Jimm

+1

@Jimm'select'函數修改它的參數。 –

+0

謝謝,好教訓。 – Jimm

1

select適用於fd_set s。看起來你正試圖傳遞一個指向描述符(一個int)的指針來選擇?

我建議您諮詢該手冊頁selectfd_set

http://linux.die.net/man/3/fd_set