守护进程与inetd
- 守护进程
一句话:Unix 网络服务要么自己变成守护进程,要么由 inetd/xinetd 托管
成为守护进程的步骤(典型):
-
fork() 后父进程 exit,子进程在后台
-
setsid() 创建新会话,脱离控制终端
-
再次 fork() 防止重新打开控制终端
-
chdir("/") 改变工作目录
-
umask(0) 清除文件模式创建掩码
-
close(0,1,2) 关闭标准 I/O,重定向到 /dev/null
-
syslog
void syslog(int priority, const char *format, ...);
priority: LOG_ERR、LOG_WARNING、LOG_INFO 等(可按 facility | level 组合)
输出到 /var/log/syslog(或系统配置的日志)
void openlog(const char *ident, int option, int facility);
void closelog(void); -
inetd 超级服务器
inetd 监听多个端口,收到连接后 fork+exec 启动对应服务
配置:/etc/inetd.conf(传统)或 xinetd 的 /etc/xinetd.d/*
好处:按需启动,节省资源;统一管理
被 inetd 启动的服务:stdin/stdout 即连接 socket,需调用 daemon_inetd() -
被 inetd 调用的 daytime 服务器
daemon_inetd(argv[0], 0); // 完成 inetd 环境初始化
Getpeername(0, cliaddr, &len); // 0 是已连接 socket
Write(0, buff, strlen(buff)); // 向客户写数据
Close(0);
浙公网安备 33010602011771号