守护进程&IO多路复用介绍

一、守护进程

1、逻辑介绍

2、相关系统调用和库函数

监控系统日志文件查看

测试用例

cpp 复制代码
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<sys/wait.h>
#include<syslog.h>
#include<string.h>
#include<fcntl.h>
#include<signal.h>
#include<string.h>
#include<errno.h>

pid_t pid;
int is_shutdown = 0;

void signal_handler(int sig)
{
    switch (sig)
    {
    case SIGHUP:
        syslog(LOG_WARNING,"收到SIGHUP信号...");
        break;
    case SIGTERM:
        syslog(LOG_NOTICE,"接收到终止信号,准备退出守护进程...");
        syslog(LOG_NOTICE,"向子进程发送SIGTERM信号...");
        is_shutdown = 1;
        kill(pid,SIGTERM);
        break;
    default:
        syslog(LOG_INFO,"Received unhandled signal");
        break;
    }
}

void my_damonize()
{
    pid_t pid;
    //先fork创建两个进程
    pid =fork();
    if (pid < 0)
    {
        exit(EXIT_FAILURE);
    }
    //马上关闭掉父进程
    //当前进程会变成孤儿进程 挂到祖先
    if (pid > 0)
    {
        exit(EXIT_SUCCESS);
    }
    //设置新的会话ID ->摆脱和当前窗口的联系
    if(setsid() < 0)
    {
        exit(EXIT_FAILURE);
    }
    //处理SIGHUP、SIGTERM信号
    signal(SIGHUP,signal_handler);
    signal(SIGTERM,signal_handler);
    //再次fork
    pid =fork();
    if (pid < 0)
    {
        exit(EXIT_FAILURE);
    }
    //再次退出父进程 -> 当前不再是会话的领导 永远不会受到窗口的影响
    if (pid > 0)
    {
        exit(EXIT_SUCCESS);
    }
    //重置umask
    umask(0);
    //将工作目录切换为根目录
    chdir("/");
    //关闭所有打开的文件描述符
    for (int x = 0; x <= sysconf(_SC_OPEN_MAX); x++)
    {
        close(x);
    }
    //开启系统日志
    openlog("this is our daemonize process:",LOG_PID,LOG_DAEMON);
}
int main()
{
    //初始化守护进程
    my_damonize();

    while (1)
    {
        pid = fork();
        if (pid > 0)
        {
            syslog(LOG_INFO,"守护进程正在监听服务端进程...");
            waitpid(-1,NULL,0);
            if (is_shutdown)
            {
                syslog(LOG_NOTICE,"子进程已被回收,即将关闭syslog连接,守护进程退出");
                closelog();
                exit(EXIT_SUCCESS);
            }
            syslog(LOG_ERR,"服务端进程终止,3s后重启...");
            sleep(3);
        }
        else if(pid  == 0)
        {
            syslog(LOG_INFO,"子进程fork成功");
            syslog(LOG_INFO,"启动服务端进程");

            char *path = "/home/lxl/daemon_and_multiplex/tcp_server";
            char *argv[]={"my_tcp_server",NULL};
            errno = 0;
            execve(path,argv,NULL);
            char buf[1024];
            sprintf(buf,"errno:%d\n",errno);
            syslog(LOG_ERR,"服务端进程启动失败");
            exit(EXIT_FAILURE);
        }
        else
        {
            syslog(LOG_ERR,"子进程fork失败");
        }

    }
    return EXIT_SUCCESS;
}
 

二、IO多路复用

相关函数

测试例程

相关推荐
dog2501 小时前
从 Kelly-NUM 到时延感知 AIMD 拥塞控制算法
网络
网络小江2 小时前
组网第27课:ARP 的能与不能——免费 ARP、代理 ARP 与 ARP 欺骗
服务器·网络·网络安全·负载均衡·免费arp
Lsetea2 小时前
curl下载HTTPS文件报23:证书验证成功与本地写入失败分层排查
linux·https·shell·ssl证书·curl
云计算练习生2 小时前
什么是文件权限?Linux 中 rwx 与数字权限的对应关系
linux·运维·服务器·操作系统·文件权限管理
FY@-@2 小时前
VMware ESXi 7.0 实验全记录:嵌套安装 → 网络配置 → 存储 → Windows 10 虚拟机部署
运维·网络·windows·云计算
叼烟扛炮2 小时前
Linux 学习笔记(十三):高效排错利器——GDB 调试器入门
linux·笔记·学习
ynchyong2 小时前
IPv4 时代的地址冲突检测
网络·ipv4·冲突检测·免费arp·无敌apr·announcemnet
饿了吃洗衣凝珠2 小时前
red hat day2
linux·运维·服务器
ONLYOFFICE2 小时前
ONLYOFFICE 10.0:深入了解最新的 40 项安全修复
网络·安全
上海云盾-高防顾问2 小时前
边缘验签是什么
运维·服务器·网络