【问题标题】:Do I need to evconnlistener_disable() before fork()?我需要在 fork() 之前 evconnlistener_disable() 吗?
【发布时间】:2020-11-03 11:13:20
【问题描述】:

我现在正在使用 libevent 开发一个服务器应用程序。

服务器有时需要执行一些外部命令(即fork() 然后exec())。我担心的是,在fork() 之后,父母和孩子可能都在有效地听,孩子可能有机会在exec()s 之前“接受”一个新的传入连接,这可能会导致父母(服务器应用程序)丢失传入的请求。

我需要在fork() 之前evconnlistener_disable()evconnlistener_enable()fork() 之后吗?

【问题讨论】:

  • libevent 如何监听?它使用单独的线程吗?它是否有一个事件循环函数,你必须调用它来处理事件?
  • 哦,你提醒我了。我以经典方式使用 libevent,即单线程,所有回调都来自事件循环。所以我不需要担心这一点,libevent 不会“接受”某些事情,直到控制流回到事件循环。 :)

标签: c linux fork libevent


【解决方案1】:

有几种方法可以做到这一点,具体取决于您的目标。您可以在父级上使用 wait() 来有效地暂停它,直到子级完成。或者立即关闭子中的侦听器文件描述符。或者,如果您只担心 exec() 期间的传入请求,您可以在文件描述符 (FD_CLOEXEC) 上设置 close-on-exec 标志。

我原以为在 fork() 之前禁用侦听器然后重新启用它也会为孩子重新启用它。

【讨论】:

  • 哦,我应该设置 FD_CLOEXEC 标志,我错过了,谢谢。我想我的担心不会发生,正如问题评论中提到的“user253751”。
猜你喜欢
  • 2020-12-18
  • 1970-01-01
  • 2021-08-11
  • 2020-02-12
  • 1970-01-01
  • 2011-11-24
  • 1970-01-01
  • 2011-09-14
  • 2020-05-05
相关资源
最近更新 更多