簡體   English   中英

用於從 epoll() 中“喚醒”的 IPC(C、UNIX)

[英]IPC for "waking up" from epoll() (C, UNIX)

我需要從另一個進程“喚醒”一個正在等待 epoll() 的進程

我創建了一個 UDS (AF_UNIX) 類型 SOCK_DGRAM,其中:

  • 客戶端每隔幾毫秒可能會向服務器發送一個字符
  • 服務器正在等待套接字上的 epoll() 讀取
    • 我不需要來自客戶端的數據,只需要從中“喚醒”

我怎樣才能最有效地做到這一點? 我是否必須讀取()數據? 服務器能否以某種方式忽略數據而不會使套接字的內存過載?

我是否必須讀取()數據? 服務器能否以某種方式忽略數據而不會使套接字的內存過載?

如果您正在持續接收套接字上的數據,那么是的,您需要讀取該數據,否則套接字緩沖區最終會填滿。 完成后,您將不會再收到任何數據。 您不需要對讀取的數據做任何事情,如果您願意,您可以一次消耗許多字節,但讀取數據是您將它們從套接字緩沖區中刪除的方式。

如果您不讀取數據,您還會發現epoll_wait()不會按照您想要的方式運行。 如果你在 level-triggered 模式下觀察 socket fd,並且已經有數據可以讀取,那么epoll_wait()不會阻塞。 如果你正在看在邊沿觸發模式的套接字fd,並已經有准備讀取數據,然后接收更多的數據不會造成epoll_wait()取消塊。

我怎樣才能最有效地做到這一點?

你真的擔心單字節read()調用的速度不超過每幾毫秒一次嗎? 這是針對某些低功耗嵌入式系統嗎?

如果您已經決定為此使用 epoll,我真的不認為有很大的改進空間。 如果結果對您來說表現不夠好,那么您可以考慮替代方案,例如進程共享的信號量或信號,盡管目前尚不清楚這兩者中的任何一個是否更好。 這就是性能測試的目的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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