守护进程&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多路复用

相关函数

测试例程

相关推荐
萧瑟余晖6 小时前
Java深入解析篇九之NIO详解
java·网络·nio
夏殇之殁6 小时前
包中创建自定义列表项。 . 使用自定义列表项进行数据绑定 . 将天气预报数据保存到本地内存表,通过LiveBindings进行显示。 ...
服务器·前端·javascript
我不管我就要叫小猪7 小时前
嵌入式Linux----网络通信
linux·运维·服务器
泡沫冰@7 小时前
ECS 的介绍和使用
linux·服务器·网络
笨鸟先飞,勤能补拙7 小时前
AI 赋能网络安全领域深度剖析
网络·人工智能·windows·安全·web安全·网络安全·github
姜太小白7 小时前
【Linux】df -h 卡住问题的通用排查与解决方案总结
linux·运维·php
土星云SaturnCloud8 小时前
抽水蓄能设备智慧运营:基于土星云边缘计算实现机组全生命周期预测性维护
服务器·人工智能·ai·边缘计算
fengyehongWorld8 小时前
Linux 终端快捷键
linux·运维
hyf3266339 小时前
泛程序:从零开始搭建稳定程序项目框架
运维·服务器·爬虫·百度·seo
哎呦喂我去去去9 小时前
C#实现屏幕墙:同时监控多个电脑桌面(支持Windows、信创Linux、银河麒麟、统信UOS)
linux·windows·c#