从listen and fork 到xinetd

Posted

技术标签:

【中文标题】从listen and fork 到xinetd【英文标题】:Going from listen and fork to xinetd 【发布时间】:2011-04-20 10:21:02 【问题描述】:

我有一个 C 网络软件,目前在侦听和分叉模式下工作。它正在侦听某个服务器套接字并接受传入连接。然后它调用提供新接受的套接字的核心服务器函数。

现在我正在尝试使该软件也可以在 xinetd 后面运行(取决于一些运行时参数)。我试图直接调用提供文件描述符 0 而不是接受的套接字的核心服务器函数,但是这种方法不起作用。程序立即以 SIG_PIPE 停止。

这种行为有什么明显的原因吗?我的核心功能执行一些低级套接字调用和信号处理。这应该在 xinetd 后面工作吗?

【问题讨论】:

您是否在xinetd 配置中为您的服务指定wait = no?如果您不这样做,它将传递侦听套接字的副本而不是接受的套接字,要求您的服务执行accept() 是的,我指定了等待 = 否,但我确实应该尝试改变我的程序行为来执行接受本身,这可能会解决我遇到的与套接字相关的问题。 那应该没问题,使用wait = no 你应该传递从accept() 返回的套接字。 【参考方案1】:

不是绝对确定,但不是您在套接字句柄上可以做的所有事情都适用于普通文件句柄。首先,您不能写入标准输入。还有一些系统调用可能需要一个套接字,例如recv().

编辑

另一种可能性:您的服务器进程是否在启动过程中关闭标准输入?

【讨论】:

xinetd 不应该为被调用的服务提供一个套接字吗? @kriss:也许吧。我假设 xinetd 创建了一个管道来与后端服务器通信,但我猜它只是用套接字描述符替换 stdin 会更明智。 好的,我想我必须阅读 xinetd 源代码才能获得明确的答案,而且我的进程在启动时不会关闭标准输入(好吧,当使用 inetd 选项调用时它不会关闭它) . @kriss:我已经看过源代码了,你是对的。

以上是关于从listen and fork 到xinetd的主要内容,如果未能解决你的问题,请参考以下文章

soft fork and hard fork

npm install and build forked github repo

Configure Dynamics 365 and Azure Service Bus Integration (using OneWay relay and listener)

[Selenium+Java] Listeners and their use in Selenium WebDriver

[PWA] 9. Service worker registerion && service work's props, methods and listeners

从克隆切换到新的fork保留更改