簡體   English   中英

使用邊緣觸發的 epoll,我應該循環發送嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM