当前位置: 首页 > news >正文

Linux 进程脱离父进程控制设置方法

在Linux中,要使进程完全脱离父进程控制,通常需要使用以下系统调用组合:

1.setsid() - 创建新会话

这是最关键的一步,它会:

  • 创建一个新的会话
  • 使调用进程成为会话首进程
  • 使调用进程成为新进程组的组长
  • 使调用进程脱离控制终端
#include<unistd.h>#include<stdio.h>intmain(){pid_tpid=fork();if(pid<0){perror("fork failed");return1;}// 父进程退出if(pid>0){_exit(0);}// 子进程创建新会话if(setsid()<0){perror("setsid failed");return1;}// 此时进程已脱离原会话和控制终端// 继续执行守护进程逻辑...return0;}

2.setpgid() - 设置进程组ID

用于更精确地控制进程组关系:

#include<unistd.h>#include<stdio.h>intmain(){pid_tpid=fork();if(pid<0){perror("fork failed");return1;}if(pid==0){// 子进程// 将自己放入新的进程组(通常与setsid配合)if(setpgid(0,0)<0){perror("setpgid failed");return1;}// 然后创建新会话if(setsid()<0){perror("setsid failed");return1;}}else{// 父进程// 父进程可以等待子进程设置完成sleep(1);// 父进程退出,子进程被init进程接管}return0;}

3.完整的守护进程实现

#include<unistd.h>#include<sys/stat.h>#include<stdio.h>#include<stdlib.h>#include<fcntl.h>voiddaemonize(){pid_tpid;// 1. 创建子进程,父进程退出pid=fork();if(pid<0){perror("fork");exit(EXIT_FAILURE);}if(pid>0){// 父进程exit(EXIT_SUCCESS);}// 2. 创建新会话,脱离控制终端if(setsid()<0){perror("setsid");exit(EXIT_FAILURE);}// 3. 改变工作目录到根目录if(chdir("/")<0){perror("chdir");exit(EXIT_FAILURE);}// 4. 重设文件权限掩码umask(0);// 5. 关闭所有文件描述符for(inti=0;i<sysconf(_SC_OPEN_MAX);i++){close(i);}// 6. 重定向标准输入输出到/dev/nullintfd=open("/dev/null",O_RDWR);if(fd!=-1){dup2(fd,STDIN_FILENO);dup2(fd,STDOUT_FILENO);dup2(fd,STDERR_FILENO);if(fd>2){close(fd);}}}intmain(){daemonize();// 守护进程的主要逻辑while(1){// 执行任务sleep(10);}return0;}

4.使用 systemd 服务的现代方法

对于现代Linux系统,推荐使用systemd服务:

# /etc/systemd/system/my-service.service [Unit] Description=My Daemon Service After=network.target [Service] Type=forking PIDFile=/var/run/my-service.pid ExecStart=/usr/local/bin/my-daemon Restart=always User=nobody Group=nogroup # 确保进程完全独立 NoNewPrivileges=yes PrivateTmp=yes ProtectSystem=strict ProtectHome=true PrivateDevices=yes [Install] WantedBy=multi-user.target

5.关键区别

系统调用作用效果
setsid()创建新会话进程成为会话首进程,脱离控制终端
setpgid(pid, pgid)设置进程组将指定进程放入指定进程组
fork()+setsid()标准守护进程完全脱离父进程控制

6.注意事项

  1. 双重fork技巧:某些情况下需要双重fork确保进程不会成为会话首进程
  2. 信号处理:重新设置信号处理器,特别是SIGHUP
  3. 资源清理:关闭不需要的文件描述符
  4. 工作目录:更改到安全目录,防止占用文件系统
  5. 日志记录:使用syslog或其他日志机制

这样设置的进程将完全独立于原始父进程,即使父进程退出也不会影响它,并由init/systemd进程接管。

http://www.jsqmd.com/news/312968/

相关文章:

  • 2026最新商用/学校/单位厨房设计推荐!西南地区优质厨房设计服务权威榜单发布,助力打造高效安全厨房空间
  • 2026年别墅/室内/老旧小区/液压式/载货电梯推荐:厦门德菱电梯工程有限公司全系解决方案
  • 2026年 CentOS 6 强制安装 GCC 及 Yum 源修复全记录
  • 2026年花生油品牌推荐:乳山市金果食品股份有限公司,知名/优质/有机/高油酸花生油全系供应
  • 【信号去噪】SSA-VMD麻雀搜索算法优化变分模态分解+皮尔逊系数+小波阈值降噪+信号重构,MATLAB代码
  • 2026最新厨房平面设计推荐!学校/食堂/单位厨房设计权威方案发布,专业团队打造高效安全厨房空间
  • 2026年耐酸/衬四氟/防腐/氟塑料/不锈钢磁力泵厂家推荐:上海梭川泵阀全系解决方案
  • 狠心卸载了 VS Code!Cursor + DeepSeek 才是 2026 年程序员的终极形态(真香预警)
  • 【收藏不亏】大模型学习进阶指南:从入门到实战避坑全攻略
  • 巧用Node.js REPL自定义提示符和命令技巧
  • 承德英语雅思培训机构推荐,2026权威测评出国雅思辅导机构口碑榜
  • 2026油烟净化设备厂家推荐:广州净平环保科技,全系产品适配餐饮/商用场景解决方案
  • 收藏!大模型工程化岗位薪资暴涨,3年经验总包60W+,从0到1实战指南来了
  • 2026年纳倍特壁挂炉推荐:全预混/燃气/电壁挂炉,节能环保与安全可靠兼具之选
  • 【必收藏】2026 AI新风向:世界模型×具身智能,解锁大模型物理世界落地密码
  • 2026年二手三坐标设备推荐:青岛科恩机电设备有限公司,九成新三坐标销售与回收服务
  • 【收藏级】大模型学习全路径:从零基础到实战落地,程序员转型必看
  • 2026气流粉碎机厂家推荐:潍坊市友信粉体设备有限公司,超微/食品/石墨/大型/扁平式粉碎机全系供应
  • 2026年螺旋输送机厂家推荐:无锡市长荣输送机械有限公司,全系列螺旋输送设备专业供应
  • 2026年冷热冲击试验箱厂家推荐:广东艾思荔检测仪器,多规格/高精度设备助力检测升级
  • 2026年VPSA/PSA制氧设备厂家推荐:无锡永业气体设备公司,高效稳定制氧解决方案
  • LANGFUSE Docker 容器化部署指南 - 指南
  • 【课程设计/毕业设计】基于ssm+Android的学籍异动管理平台涵盖学生、教师、课程、班级、成绩、排课、选课、学籍、考勤、教学计划、教学资源【附源码、数据库、万字文档】
  • 企业所得税按年计征、分季预缴(1月、4月、7月、10月)、年度汇算清缴(次年5月31日前);
  • 期刊抗衰老重磅发现:W+端粒塔核心逻辑破局,NMN能驱动免疫细胞年轻20岁
  • 2026最新双壁热缩管推荐!新能源汽车/航天航空/医疗行业专用热缩管权威榜单发布,合规品质双保障助力高端领域绝缘防护
  • 2026年铝板厂家实力推荐:上海岱通铝业5754/6061/氧化/1060/3003/5083/5052铝板全系供应
  • 小程序毕设选题推荐:基于ssm+Android的学校学籍管理设计的综合性平台学籍异动管理平台【附源码、mysql、文档、调试+代码讲解+全bao等】
  • 为什么说RAG只是AI的基础设施?看完视频检索就懂了
  • 本地部署FastGPT使用在线大语言模型