[英]Using edge triggered epoll, should I loop over send?
我正在使用 epoll 編寫媒體服務器。 fds 都設置為非阻塞,我正在使用邊緣觸發事件。 我知道對於 EPOLLIN,我需要循環讀取 fd,直到返回 EAGAIN。 但是寫作呢?
當我想寫數據時,我將數據排隊並在 fd 上設置 EPOLLOUT|EPOLLIN|EPOLLET。 當 EPOLLOUT 事件發生時,我一次性寫入整個隊列緩沖區:
n = send ( fd, buf, buf_len, MSG_NOSIGNAL );
如果 n > 0 && n < buf_len 我只是重置 EPOLLOUT 並返回。 我沒有看到循環發送的意義(我認為 epoll 的手冊頁暗示了這一點)。 看起來 send 已經表明它已經接受了所有它可以並且如果立即調用將返回 EAGAIN。
在這里消除系統調用是最有效的途徑嗎?
epoll 手冊頁說:
對於面向流的文件(例如,pipe、FIFO、stream socket),還可以通過檢查目標文件描述符讀取/寫入的數據量來檢測讀/寫I/O空間耗盡的情況。 例如,如果您通過請求讀取一定數量的數據來調用 read(2),而 read(2) 返回的字節數較少,則可以確定文件描述符的讀取 I/O 空間已用盡。 使用 write(2) 寫入時也是如此。 (如果你不能保證被監控的文件描述符總是指向一個面向流的文件,請避免使用后一種技術。)
我做了一堆測試,似乎循環發送是浪費時間。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.