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

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

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

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

【问题讨论】:

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

标签: c sockets xinetd


【解决方案1】:

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

编辑

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

【讨论】:

  • xinetd 不应该为被调用的服务提供一个套接字吗?
  • @kriss:也许吧。我假设 xinetd 创建了一个管道来与后端服务器通信,但我猜它只是用套接字描述符替换 stdin 会更明智。
  • 好的,我想我必须阅读 xinetd 源代码才能获得明确的答案,而且我的进程在启动时不会关闭标准输入(好吧,当使用 inetd 选项调用时它不会关闭它) .
  • @kriss:我已经看过源代码了,你是对的。
猜你喜欢
  • 1970-01-01
  • 2015-01-24
  • 2022-12-19
  • 1970-01-01
  • 2012-09-10
  • 2011-11-01
  • 2021-07-18
  • 1970-01-01
  • 2014-09-08
相关资源
最近更新 更多