扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
2.一个简单的服务程序 goodie
|
3.配置文件
在/etc/services 中加入如下项
goodie 12345/tcp
服务名是 goodie 服务端口是 12345 服务类型是 TCP
在/etc/xinetd.d目录下新检服务文件 goodie
输入内容:
|
4.启动服务
先停止服务
killall xinetd
启动服务
/usr/sbin/xinetd -f /etc/xinetd.conf
5.开启终端连接
telnet localhost 12345
6.xinetd 的工作原理
通过配置xinetd,然后查看相应的套接字和进程,可以看出,xinetd是这样工作的(针对tcp服务)
A.启动时读取/etc/xinetd.conf文件并为文件中指定的所有服务创建相应的套接字(流或数据报),xinetd能处理的服务的数目依赖于所创建的套接字数目。每个新创建的套接字都被加入到select调用所用到的描述符集中。
B.对每一个套接字调用bind,绑定服务端口(/etc/services中定义),端口号通过调用getservbyname获得。
C.所有套接字建立后,调用select等待它们变为可读,当tcp套接字上有数据报到来时变为可读。xinetd在大部分时间阻塞在select的调用处;
D.xinetd守护进程fork,由子进程处理服务请求;子进程关闭除了要处理的套接字之外的所有描述字,子进程三次调用dup2,把套接字描述字复制到0、1、2,然后关闭原套接字;以后程序对套接字操作就是对0、1、2进行操作;子进程exec执行相应的服务器程序,并将配置文件中的参数传递。
E. 因为tcp服务器通常设置nowait标记,表示xinetd在该套接字上再次选择之前,必须等待在该套接字上服务的子进程终止。所以,父进程中的fork返回时,把子进程的进程号记录下来,这样,在子进程终止时,父进程可以用waitpid的返回值查知是那一个子进程;父进程用FD_CLR宏关闭select使用的描述字集中与这个套接字对应的位,以便不对该套接字select;当子进程终止时,父进程收到一个SIGCHLD信号,父进程的信号处理程序得到终止子进程的进程号,父进程通过打开描述字集中对应的位恢复对该套接字的select。
7.重新实现的XINETD超级守护程序
A.程序利用上面的原理在思路上重新实现了超级守护进程。
B.程序在一些地方只是概念性的代码,完全实现还有待补充。
C.程序能演示XINETD 的功能,但是在注释有BUG 和NOTE 的地方还需改进
D.这是一个总结性的资料,参考了“利用INETD实现UDP守护进程“和“www.douzhe.com“上的文章。
|
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者