C 从listen和fork到xinetd
我有一个C网络软件,目前在listen和fork模式下工作。它正在侦听某个服务器套接字并接受传入连接。然后,它调用提供新接受套接字的核心服务器函数 现在,我正试图让该软件也在xinetd后面工作(取决于一些运行时参数)。我试图直接调用提供文件描述符0的核心服务器函数,而不是一个可接受的套接字,但是这个方法不起作用。该程序立即停止与信号管道C 从listen和fork到xinetd,c,sockets,xinetd,C,Sockets,Xinetd,我有一个C网络软件,目前在listen和fork模式下工作。它正在侦听某个服务器套接字并接受传入连接。然后,它调用提供新接受套接字的核心服务器函数 现在,我正试图让该软件也在xinetd后面工作(取决于一些运行时参数)。我试图直接调用提供文件描述符0的核心服务器函数,而不是一个可接受的套接字,但是这个方法不起作用。该程序立即停止与信号管道 这种行为有什么明显的原因吗?我的核心函数执行一些低级套接字调用和信号处理。这在xinetd后面应该可以工作吗?不是绝对确定的,但并不是所有在套接字句柄上可以做
这种行为有什么明显的原因吗?我的核心函数执行一些低级套接字调用和信号处理。这在xinetd后面应该可以工作吗?不是绝对确定的,但并不是所有在套接字句柄上可以做的事情都可以在普通文件句柄上工作。首先,你不能给stdin写信。还有一些系统调用可能需要套接字,例如
recv()
编辑
另一种可能性:您的服务器进程是否在启动时关闭stdin?不是绝对确定的,但并非在套接字句柄上可以执行的所有操作都适用于普通文件句柄。首先,你不能给stdin写信。还有一些系统调用可能需要套接字,例如
recv()
编辑
另一种可能性:您的服务器进程是否在启动时关闭stdin?xinetd不应该为被调用的服务提供套接字吗?@kris:可能吧。我假设xinetd创建了一个与后端服务器对话的管道,但如果它只是用我猜的套接字描述符替换stdin,那就更明智了。好的,我猜我必须阅读xinetd源代码才能得到明确的答案,而且我的进程在启动时不会关闭stdin(当使用inetd选项调用时,它不会关闭它)@kriss:我已经看过了源代码,你是对的。xinetd不是应该为被调用的服务提供一个套接字吗?@kriss:可能吧。我假设xinetd创建了一个管道来与后端服务器通信,但我想用套接字描述符替换stdin更明智。好吧,我想我必须读xinetd源代码,以获得明确的答案,并且没有我的进程在启动时不关闭stdin(好吧,当使用inetd选项调用它时不关闭它)@kris:我已经看过源代码了,你说得对。你是否在
xinetd
配置中为你的服务指定了wait=no
?如果你不指定,它将传递监听套接字的副本,而不是接受的套接字,要求你的服务执行accept()
。是的,我指定的是wait=no,但我确实应该尝试更改程序行为以执行accept本身,可能它将解决我遇到的与套接字相关的问题。这样就可以了,使用wait=no
应该向您传递从accept()返回的套接字
。是否在xinetd
配置中为您的服务指定wait=no
?如果不指定,它将传递侦听套接字的副本,而不是已接受的套接字,要求您的服务执行accept()
。是的,我指定了wait=no,但我确实应该尝试更改程序行为以执行accept本身,可能它将解决我遇到的与套接字相关的问题。那么,使用wait=no
应该可以传递从accept()
返回的套接字。