网络编程13

守护进程与inetd

  1. 守护进程
    一句话:Unix 网络服务要么自己变成守护进程,要么由 inetd/xinetd 托管

成为守护进程的步骤(典型):

  1. fork() 后父进程 exit,子进程在后台

  2. setsid() 创建新会话,脱离控制终端

  3. 再次 fork() 防止重新打开控制终端

  4. chdir("/") 改变工作目录

  5. umask(0) 清除文件模式创建掩码

  6. close(0,1,2) 关闭标准 I/O,重定向到 /dev/null

  7. 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);

  8. inetd 超级服务器
    inetd 监听多个端口,收到连接后 fork+exec 启动对应服务
    配置:/etc/inetd.conf(传统)或 xinetd 的 /etc/xinetd.d/*
    好处:按需启动,节省资源;统一管理
    被 inetd 启动的服务:stdin/stdout 即连接 socket,需调用 daemon_inetd()

  9. 被 inetd 调用的 daytime 服务器
    daemon_inetd(argv[0], 0); // 完成 inetd 环境初始化
    Getpeername(0, cliaddr, &len); // 0 是已连接 socket
    Write(0, buff, strlen(buff)); // 向客户写数据
    Close(0);

posted on 2026-03-02 10:37  cyusouyiku  阅读(1)  评论(0)    收藏  举报