在我的應用程序中,當報警觸發時,我從信號處理程序向管道寫入一個整數。 在我的主要應用程序中,我永遠循環選擇()與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
}
我從未想過我會去用這個當有人居然說'select'被打破:選擇不破( http://www.codinghorror.com/blog/2008/03/the-first-rule-of-programming-its-always-your-fault.html) –
@BrianRoach它更像是一個英語問題。在解決了這個問題幾個小時之後,到了晚上,我真的沒有想到比我的選擇無法工作的更好的標題。我真正的意思是我的選擇在我的上下文中的使用,當然不是那個選擇被打破了 – Jimm
對不起,它意味着比其他任何事情更開玩笑/開玩笑。我的意思是沒有進攻。 –