linux守护进程的作用和原理、创建守护进程的三种方式

发布时间:2023-08-14 23:37:58 作者:yexindonglai@163.com 阅读(922)

一、什么是守护进程

守护进程(Daemon)是在操作系统中运行的一种特殊类型的后台进程。它在系统启动时启动,并在系统关闭时终止,与用户交互的终端会话无关。守护进程通常在后台运行,不会与用户进行直接的交互,也不会被用户终止。

守护进程通常用于执行一些系统级的任务和服务,比如网络服务、数据库服务、日志记录、定时任务等。它们在系统运行时一直保持活动状态,为其他应用程序或用户提供服务

二、守护进程和普通进程的区别

守护进程相对于普通进程的主要区别在于其独立于终端会话,并且在后台持续运行。守护进程通常用于以下几个方面:

  1. 后台运行:守护进程不与终端关联,不受终端关闭或用户注销的影响,可以在后台持续运行。这对于需要长时间运行或定期执行任务的应用程序非常有用。

  2. 无人值守:守护进程可以在没有用户交互的情况下执行任务,比如定期备份、日志记录、监控等。这使得应用程序可以在没有人为干预的情况下自动执行。

  3. 资源管理:守护进程可以独立于终端会话,并且可以以系统级别的权限运行。这使得守护进程可以管理系统资源,如网络服务、数据库服务等,而不受特定用户登录或注销的影响。

  4. 多任务处理:守护进程可以同时处理多个任务或请求,通过并发处理提高系统的吞吐量和响应能力。

总之,守护进程的主要意义在于提供一种后台运行、无人值守、资源管理和多任务处理的机制,使得应用程序可以在系统层面上提供持续的服务和功能。这对于服务器应用程序、网络服务、系统监控等场景非常重要。

三、创建守护进程的三种方式

  1. 使用nohup命令
  2. 使用fork()函数按步骤创建
  3. daemon() 函数直接创建守护进程

四、举个栗子

1、使用fork函数

要创建一个守护进程,可以按照以下步骤进行:

  1. 创建一个子进程,并使父进程退出。这可以通过调用fork()函数来实现。

  2. 在子进程中调用setsid()函数创建一个新的会话,并使子进程成为该会话的首进程。这将使子进程脱离控制终端。

  3. 关闭标准输入、标准输出和标准错误输出。可以使用close()函数关闭文件描述符,或者将它们重定向到/dev/null文件。

  4. 改变当前工作目录到一个合适的位置,以免影响其他文件系统的挂载。

  5. 重新设置文件权限掩码,以确保守护进程创建的文件具有适当的权限。

  6. 在守护进程中执行需要的操作,如处理请求、定期任务等。

下面是一个简单的示例代码:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4. #include <sys/types.h>
  5. #include <sys/stat.h>
  6. int main() {
  7. pid_t pid = fork();
  8. if (pid < 0) {
  9. perror("fork error");
  10. exit(1);
  11. }
  12. if (pid > 0) {
  13. // 父进程退出
  14. exit(0);
  15. }
  16. // 创建新会话
  17. if (setsid() < 0) {
  18. perror("setsid error");
  19. exit(1);
  20. }
  21. // 关闭标准输入、标准输出和标准错误输出
  22. close(STDIN_FILENO);
  23. close(STDOUT_FILENO);
  24. close(STDERR_FILENO);
  25. // 改变当前工作目录
  26. chdir("/");
  27. // 重新设置文件权限掩码
  28. umask(0);
  29. // 在守护进程中执行需要的操作
  30. // ...
  31. return 0;
  32. }

2、使用daemon函数

以下的示例中,我们调用了 daemon(0, 0) 来创建守护进程。daemon 函数的两个参数 nochdir 和 noclose 都设置为0,表示守护进程将会修改工作目录并关闭文件描述符。

如果 daemon 函数调用成功,它会使当前进程分叉出一个子进程,并使父进程退出,子进程成为守护进程。此时,守护进程将与控制终端分离,不再与用户交互。

  1. #include <unistd.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. int main() {
  5. int result = daemon(0, 0);
  6. if (result == -1) {
  7. perror("Failed to create daemon process");
  8. exit(1);
  9. }
  10. // 守护进程的逻辑代码
  11. return 0;
  12. }

3、使用nohup

nohup 是一个在 Unix 和类 Unix 系统上的命令,用于在后台运行程序,并且忽略挂起信号(SIGHUP)。它的名称是 “no hang up” 的缩写。

使用 nohup 命令可以在终端关闭或用户注销时继续运行程序,而不会受到 SIGHUP 信号的影响。这对于长时间运行的任务或后台服务很有用。

以下列举了几种nohup用法

  1. nohup ./main.exe
  2. nohup java -jar xxx.jar &
  3. nohuo tail -f xx.log
  4. nohuo tail -f xx.log &

关键字c++