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



我需要从另一个进程"唤醒"正在等待epoll((的进程。

我创建了一个UDS(AF_UNIX(类型的SOCK_DGRAM,其中:

  • 客户端每隔几毫秒可能会向服务器发送一个字符
  • 服务器正在套接字上使用epoll((等待读取
    • 我不需要来自客户端的数据,只需要从中"醒来">

我如何才能最有效地执行?我必须读取((数据吗?服务器能以某种方式忽略数据而不使套接字的内存过载吗?

我必须读取((数据吗?服务器能以某种方式忽略数据而不使套接字的内存过载吗?

如果您正在套接字上持续接收数据,那么是的,您需要读取该数据,否则套接字缓冲区最终会填满。之后,您将不会再收到任何数据。您不需要对读取的数据做任何事情,如果愿意,您可以一次消耗许多字节,但读取数据就是将它们从套接字缓冲区中删除的方式。

如果不读取数据,您还会发现epoll_wait()的行为并不像您想要的那样。如果您正在级别触发模式下观察套接字fd,并且已经有数据可供读取,那么epoll_wait()将不会阻塞。如果您正在边缘触发模式下观察套接字fd,并且已经有数据可供读取,那么接收更多数据将不会导致epoll_wait()un块。

我如何才能最有效地执行

您真的担心以不超过每几毫秒一次的速率进行的单字节read()调用吗?这是针对低功耗嵌入式系统的吗?

如果你已经决定使用epoll,我真的看不出有多大的改进空间。如果它的性能对你来说不够好,那么你可以考虑其他选择,比如处理共享信号量或信号,尽管目前还不清楚这两种方式是否更优越。这就是性能测试的目的。

最新更新