守护进程 linux

守护进程是持续运行且不受用户登录登出影响的进程,常用于后台服务。其主要特性包括后台运行、脱离终端、改变工作目录、关闭文件描述符等。实现守护进程时,需通过fork、setsid等函数确保进程独立,并使用umask、chdir、close及open函数进行环境隔离。此外,守护进程的启动方式多样,如rc.d启动脚本、inetd、crond或用户终端。了解进程组、会话组等概念有助于更好地理解守护进程的工作原理。
摘要由CSDN通过智能技术生成

守护进程

守护进程,说白了,就是 能够一直存在,不随着用户等的登入或登出,和整个 操作系统一起运行,在系统启动时开启,在其关闭时终止的进程。

守护进程的特性

1. 在后台上运行

守护进程最重要的特征,便是在后台运行,不随终端的打开关闭与用户的登入登出而关闭打开
为避免挂起控制终端,要将 daemon 放入后台执行,其方法是,在进程中调用 fork 使父进程终止,让daemon在子进程中后台执行。具体就是调用 fork ,然后使父进程 exit 。这样做实现了下面几点:
第一,如果该精灵进程是由一条简单 shell 命令起动的,那么使父进程终止使得 shell 认为这条命令已经执行完成。
第二,子进程继承了父进程的进程组 ID ,但具有一个新的进程 ID ,这就保证了子进程不是一个进程组的首进程。这对于下面就要做的 setsid 调用是必要的前提条件。

2. 脱离原先的控制终端,登录会话和进程组(必须与之前的运行环境隔离开来!!! 3,4,5 其实都属于和之前的运行环境隔离开,这里分开来讲述!)

创建守护进程,必须与其之前的运行环境隔离开来,这些环境包括未关闭的 文件描述符,控制终端,会话组及进程组、工作目录及文件创建掩码等。 而这些环境,通常是由其父进程继承而来的。
(登录会话可以包含多个进程组,这些进程组共享一个控制终端,这个控制终端通常是创建进程的登录终端、控制终端,登录会话和进程组通常是从父进程继承下来的。)
可以调用 setsid() 使得 子进程成为 新的会话组的组长, setsid 要求 让成为新会话组组长的进程,不能已经是一个进程组组长,所以,此处也必须为 子进程。

作用:
(1)让进程摆脱原会话的控制
(2)让进程原进程组的控制
(3)让进程摆脱原控制终端的控制

关于为什么要求 setsid 不能是将进程组组长设为 会话:
https://blog.csdn.net/liuxingen/article/details/45586793

为什么setsid要有这个前提条件呢?
 我们先假设没有这个前提,那么当我们的示例调用完成以后我们会新建一个会话,会话ID等于17641,我们还新建一个已经存在的进程组17461(这是第一个错误)。
  假设17461这个进程组中还包含有其它的进程17464,当我们调用完成以后我们发现同一个进程组中的两个进程17461和17464分别属于两个不同的会话17461和17359(这是第二个错误)。

3. 禁止进程重新打开控制终端

守护进程,已经是一个无终端的会话组组长,但它可以重新申请打开一个控制终端。可以通过使进程不再成为会话组长来禁止进程重新打开控制终端

4. 改变当前工作目录

将当前的工作目录更改为根目录,从父进程继承而来的当前工作目录,可能在一个 装配的文件系统中,因为守护进程需要能够于系统一同 启动,关闭,所以,不能放在有依赖,需要等待系统 装配的工作目录(文件目录)下,使用 chdir(“目录”) 改变 守护进程的工作目录,一般直接放到 根目录下( \ )

5. 关闭打开的文件描述符

进程从创建它的父进程那里继承了打开的文件描述符。如不关闭,将会浪费系统资源,造成进程所在地文件系统无法卸下以及无法预料的错误。一般来说,必要的是关闭0、1、2三个文件描述符,即标准输入、标准输出、标准错误。因为我们一般希望守护进程自己有一套信息输出、输入的体系,而不是把所有的东西都发送到终端屏幕上。

######## 1. umask() 设置为 0 , 让这个进程,可以有最大的文件操作权限,因为它永远不退出,所以它打开文件以后,其他也打开就会有问题,赋予此进程最大权限,能够操作文件,不会因为权限不足导致不能写入,或者保存等等。
umask是什么?https://blog.csdn.net/tanggao1314/article/details/52168237

umask一般是用在你初始创建一个目录或者文件的时候赋予他们的权限
当我们登录系统之后创建一个文件总是有一个默认权限的,那么这个权限是怎么来的呢?这就是umask干的事情。umask设置了用户创建文件的默认 权限,它与chmod配套使用,chmod设置的是文件权限码。
umask值就是指“Linux文件的默认属性需要减掉的权限”。比如Linux普通文件的最大默认属性是666,目录文件的最大属性是777。但是我们不想要用户在新建立文件时,文件的属性是666或777,那么我们就要设置umask值。Linux系统预置的umask值是022,那么用户在新建立普通文件时,普通文件的属性就是666-022=644,新建立目录文件时,目录文件的属性就是777-022=755。
######## 2. for(int i = 0; i < sysconf(_SC_OPEN_MAX); i++) close(i);
sysconf(_SC_OPEN_MAX); 获取当前系统中允许打开的最大文件数目。 循环关闭所有打开的文件。
######## 3. 打开 0 1 2号文件描述符(标准输入,标准输出,标准错误),把它们重定向到/dev/null
open("/dev/null",O_RDWR);
open("/dev/null",O_RDWR);
open("/dev/null",O_RDWR);
open函数返回的文件描述符fd一定是未使用的最小的文件描述符。利用这个特性,可以改变0,1,2这三个文件描述符所指向的文件,由于进程默认会打开0,1,2这三个文件描述符,而且指向了键盘和显示器的设备文件。如果在open之前先进行close(1),然后再调用open函数就会返回最小的未使用的fd,也就是0。
/dev/null NULL 空,这个就是一个指向 null 设备的空设备,因为关闭了所有,而后再次 open 就使得 输入 输出 和 错误均指向了 /dev/null

Qt守护进程Linux下的实现可以参考以下方法。首先,可以参考中的Linux守护进程的编程方法,了解如何编写守护进程的例程。该方法使用了信号和后台执行的技术。其次,可以参考中的文章,该文章介绍了创建守护进程的第一步,即脱离控制终端。通过完成这一步骤,程序在Shell终端中会产生已经运行完毕的假象,并且接下来的工作都会在子进程中完成。最后,可以参考中的方法,该方法通过UDP通信来实现守护进程的功能。在这种实现方式中,守护进程程序负责检测主程序是否存在,如果不存在则启动。主程序只需要启动一个监听端口,当收到特定消息时回复相应的内容。这种方式可以兼容任意程序。总之,以上方法提供了一些关于在Linux下使用Qt实现守护进程的思路和参考资料。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Linux 下Qt实现守护进程](https://blog.csdn.net/thanklife/article/details/125198733)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [Qt编写守护进程](https://download.csdn.net/download/feiyangqingyun/10989964)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值