• Linux守护进程


    什么是守护进程

    守护进程独立于控制终端,通常周期性地执行某种任务或等待处理某些事件。守护进程的特点使它们非常适合作为服务器上的服务进程,处理如邮件传输、打印服务、文件传输等任务。

    守护进程的特点

    后台运行:守护进程在后台执行,不会占用用户的终端或交互界面。

    长期运行:它们从系统启动时开始运行,直到系统关闭,除非被明确停止。

    没有控制终端:守护进程通常不会打开控制终端,它们不会与用户直接交互。

    在新会话中启动:守护进程通常会启动一个新的会话,并成为该会话的首进程,从而与启动它们的终端和用户会话脱离关系。

    处理系统级任务:守护进程通常用于执行系统级任务,如日志文件的维护、任务调度等。

    如何创建守护进程

    创建子进程,退出父进程:这样可以保证该进程不是进程组的首进程,允许它调用setsid创建新会话。因为POSIX标准规定,setsid()调用失败如果调用进程已是进程组的领导。这是为了防止进程组领导重新获取控制终端,这与守护进程的独立性质相违背。

    创建新的会话:调用setsid创建一个新的会话,使进程成为会话首进程,脱离原有控制终端。

    改变当前目录:将当前工作目录更改为根目录,以避免守护进程阻止卸载文件系统。因为在运行期间,一个进程可能会打开和操作其当前工作目录下的文件,如果这个目录被删除或移动,可能会导致一些意想不到的错误。将工作目录更改为根目录可以防止这种情况的发生,因为根目录是系统中不可删除的核心部分。

    重设文件权限掩码:调用umask设置一个适当的文件创建权限掩码,通常是0。因为要确保守护进程创建的文件具有最大的权限

    关闭文件描述符:关闭继承自父进程的所有文件描述符,包括标准输入、标准输出和标准错误。因为守护进程不与外界打交道,所以这些文件描述符也将没有意义。为了节省系统资源所以关闭(它的文件描述符是通过父类继承下来的)。

    处理标准输入、输出和错误:通常会将这些重定向到/dev/null。因为守护进程通常不会与用户交互,也不需要在终端上输出信息。将标准输出和标准错误重定向到/dev/null可以将所有输出静默化,从而避免在不需要时输出到终端上。如果守护进程尝试从标准输入读取数据,而标准输入没有输入,它可能会被阻塞等待输入。将标准输入重定向到/dev/null可以确保即使有输入尝试读取,也会立即返回文件结束(EOF),避免进程阻塞。

    示例代码:

    1. #include
    2. #include
    3. #include
    4. #include
    5. using namespace std;
    6. int main()
    7. {
    8. pid_t pid = fork();
    9. assert(pid!=-1);
    10. if(pid>0) // 父进程
    11. {
    12. exit(0);
    13. }
    14. else // 子进程
    15. {
    16. //1
    17. setsid();
    18. //2
    19. chdir("/");
    20. //3
    21. umask(0);
    22. //4
    23. for (int fd = 3; fd < 1024; fd++)
    24. close(fd);
    25. //5
    26. int devNull = open("/dev/null", O_RDWR);
    27. if (devNull == -1)
    28. {
    29. perror("open /dev/null");
    30. exit(EXIT_FAILURE);
    31. }
    32. if (dup2(devNull, 0) == -1 || dup2(devNull, 1) == -1 || dup2(devNull, 2) == -1)
    33. {
    34. perror("dup2");
    35. exit(EXIT_FAILURE);
    36. }
    37. close(devNull);
    38. }
    39. }

  • 相关阅读:
    [ CTF 学习 ] CTF 中的隐写集合 —— 图片隐写术
    linux开发技术栈
    开发环境搭建
    sqlalchemy模块介绍、单表操作、一对多表操作、多对多表操作、flask集成.
    如何做红烧肉好吃又不腻 教你做红烧肉
    一点一点学习C++之笔记003
    java毕业设计基于javaweb+mysql数据库实现的在线学习网站|在线课堂含论文+开题报告
    Spring Boot 版本 GA、RC、beta等含义
    gorm 自定义时间、字符串数组类型
    深度学习【使用pytorch实现基础模型、优化算法介绍、数据集的加载】
  • 原文地址:https://blog.csdn.net/qq_64863535/article/details/136744191