Linux Daemon进程
模型
- 创建孤儿进程 fork()
- 创建新的会话 setid()
- 改变当前目录为根目录chdir()
- 重设文件权限掩码umask()
- 关闭文件描述符close()
创建孤儿进程
创建孤儿进程只需要将父进程关闭保留子进程
pid_t pid_child=fork();
if(0<pid_child){
exit(0);
}
创建新的会话
会话组是一个或多个进程组的集合,一个shell就是一个会话,可以分为前台进程组和后台进程组,每个进程组都有一个组长,组长进程的pid就是进程组的id,当一个会话结束的时候,依附于它的进程都会关闭
setsid()
函数用于创建一个新的会话,并使得当前进程成为新会话组组长,也就是说使进程完全独立出来,从而脱离所有其他进程的控制,但是setsid()不能在一个会话组长进程中被调用,所以我们先创建子进程,并使其成为孤儿进程,这样它就脱离了原来的会话,此时调用setsid可以使其成为一个新的会话的组长进程。当然,作为组长进程,虽然它脱离了原来的会话,失去了终端,满足了守护进程的需求,但是它完全可以自己再打开一个终端,所以我们有时会在准备好守护进程条件之后再fork
一次创建孙进程,然后让子进程自杀,在孙进程中执行守护进程的代码,这样新的守护进程就不会开启自己的终端。
pid_t pid;
pid=setsid();
改变当前目录为根目录
守护进程的工作目录是不能被卸载的,选择根目录是个很好的方式,切换进程的工作目录可以使用chdir()
chdir("\");
重设文件权限掩码
文件权限掩码是指问家权限中被屏蔽掉的对应位,把文件权限掩码设置为0,可以增加该守护进程的灵活性,和$umask
类似,设置进程的文件权限掩码的函数是umask()
umask(0); //将文件权限掩码设为0
关闭文件描述符
如果父进程中打开的文件时候没有指定"close-on-exec"选项,那么子进程会继承父进程的文件描述符,这些文件描述符在制作守护进程的时候需要将其关闭。一个进程打开的所有文件描述符都在该进程的文件描述符表中,这个表的大小可以使用函数gettablesize()
来获得
fdtablesize=gettablesize();
for(fd=0;fd<fdtablesize;fd++){
close(fd);
}
再次创建孤儿进程
pid_t pid_gchild=fork();
if(0<pid_gchild){
exit(0);
}
//孙进程执行的代码
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
· .NET 适配 HarmonyOS 进展
· 手把手教你更优雅的享受 DeepSeek
· 腾讯元宝接入 DeepSeek R1 模型,支持深度思考 + 联网搜索,好用不卡机!
· AI工具推荐:领先的开源 AI 代码助手——Continue
· 探秘Transformer系列之(2)---总体架构
· V-Control:一个基于 .NET MAUI 的开箱即用的UI组件库