news 2026/10/20 3:16:39

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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进程接管。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/13 16:14:13

小程序毕设项目:基于SpringBoot+Vue的个人健康管理小程序的设计与实现(源码+文档,讲解、调试运行,定制等)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/10/13 18:58:15

基于plc在十字路口交通信号灯控制系统设计

2交通信号灯的控制系统分析 各路口和各路段的交通信号灯控制&#xff0c;也就是交通信号控制&#xff0c;它以电子技术为基础&#xff0c;并借助于PLC技术进行科学合理的设计&#xff0c;为了研究怎样正确运用PLC技术到交通信号灯的控制系统上&#xff0c;我们首先要知道交通信…

作者头像 李华
网站建设 2026/10/19 6:09:14

Python Pandas完全指南:从核心数据结构到实战操作

Pandas 是 Python 中最核心的数据分析库&#xff0c;专为高效处理结构化数据&#xff08;如表格、时间序列&#xff09;设计&#xff0c;提供了直观的数据结构和丰富的操作方法。它基于 NumPy 构建&#xff0c;弥补了 NumPy 对非数值/混合类型数据的支持不足&#xff0c;是数据…

作者头像 李华
网站建设 2026/10/14 16:22:02

​2030年企业永续创新指南:AI+量子双驱动,五大预测重塑商业范式

摘要&#xff1a;本报告基于IBM全球2000名高管调研数据&#xff0c;揭秘企业从“渐进式优化”到“指数级创新”的核心逻辑——以AI为核心生产力、量子为未来增量&#xff0c;通过五大关键趋势重构战略、组织与技术&#xff0c;为企业领导者、决策者、创新从业者提供全景行动指南…

作者头像 李华