2012-03-24 80 views
1

我正在使用epoll將大型消息寫入使用HTTP協議的服務器。 fds全部設置爲非阻塞狀態,我正在使用邊緣觸發的事件。我知道EPOLLIN我需要循環讀取fd,直到EAGAIN返回。對於編寫,我不確定一旦獲得EAGAIN後是否應該繼續循環,或者是否應該等待epoll通知fd何時可以再次讀取。例如,我正在寫一條20K的消息,並且在第一個::寫入嘗試中發送的數據量= 13K。下一次嘗試寫入將返回retVal = -1和errno = EAGAIN。寫入文件描述符時的epoll行爲

此時我應該繼續在一段時間內循環(1),直到我可以寫入數據,或者當FD準備再次寫入時,我應該等待epoll調用我的回調。我的理解是,由於fd是註冊書寫,所以當FD準備再次寫入時,epoll應通知我。但是,這似乎並沒有發生在我的程序中。

我是否需要設置特殊標誌或修改FD來獲取通知?

回答

4

在這一點上,我應該在一段時間(1)繼續循環,直到我可以寫數據

沒有!

或者我應該等待epoll在FD準備再次寫入時調用我的回調。

是的,你應該(但什麼回調?epoll_wait沒有回調機制,它只是返回)

我的理解是,既然fd被註冊寫作,epoll的應該通知我當FD準備再次寫入時。但是,這似乎並沒有發生在我的程序中。

如果FD註冊爲EPOLLOUTEPOLLIN | EPOLLOUT,它應該的確如此。你能否提供一個證明問題的小例子?

+0

詹姆斯,謝謝你的迴應。我在代碼中存在一個錯誤 - 這就是爲什麼一旦它可用於再次寫入時,我沒有在fd上收到EPOLLET事件。它現在按預期工作。 – user1290156 2012-03-27 15:29:07

相關問題