news 2026/5/14 0:40:27

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/5/12 9:41:29

本地部署FastGPT使用在线大语言模型

FastGPT 是一个基于 LLM 大语言模型的知识库问答系统&#xff0c;提供开箱即用的数据处理、模型调用等能力&#xff0c;它背后依赖OneApi开源项目来访问各种大语言模型提供的能力。各大语言模型提供的访问接口规范不尽相同&#xff0c;为此OneApi项目提供了统一的API接口去对接…

作者头像 李华
网站建设 2026/5/11 6:10:11

为pngme拓展对gif格式支持

为pngme拓展对gif格式支持引言GIF格式简读GIF结构原始数据到结构数据读屏幕逻辑数据读图像数据读取扩展块读取子块链将文本写入应用扩展块结构数据到原始数据引言 前序文章为pngme拓展加密功能与jpg格式支持-CSDN博客&#xff0c;其中所提到的东西&#xff0c;本文不会重复提及…

作者头像 李华
网站建设 2026/5/10 9:22:13

互联网大厂Java求职面试实战:微服务、缓存与AI技术全栈问答解析

互联网大厂Java求职面试实战&#xff1a;微服务、缓存与AI技术全栈问答解析 本文以互联网大厂Java求职者谢飞机与严肃面试官的对话形式&#xff0c;真实还原面试场景&#xff0c;涵盖Java SE 8/11/17、Jakarta EE、Spring Boot、微服务架构、数据库ORM、缓存技术、消息队列、安…

作者头像 李华
网站建设 2026/5/11 2:58:09

Linux驱动probe函数全解析:以蜂鸣器驱动为例,吃透初始化流程与规范

Linux驱动probe函数全解析&#xff1a;以蜂鸣器驱动为例&#xff0c;吃透初始化流程与规范 probe函数是Linux platform驱动的“灵魂入口”——当内核完成驱动与设备树/平台设备的匹配后&#xff0c;会调用probe函数完成驱动的核心初始化。本文以蜂鸣器驱动的probe函数为例&…

作者头像 李华
网站建设 2026/5/10 3:04:00

AI人工智能如何正确入行(小白程序员必收藏)

到底做什么&#xff0c;才算真正入行AI&#xff1f; 这个话题我在之前的分享中多次提及&#xff0c;今天结合工业界实际场景再系统梳理一遍&#xff1a;在企业中直接落地AI技术的岗位&#xff0c;核心可分为三大类——算法类、工程类、数据类。 当下网络上&#xff0c;无论是…

作者头像 李华