news 2026/4/17 20:39:15

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/4/18 8:49:42

【收藏级】大模型学习全路径:从零基础到实战落地,程序员转型必看

当前AI大模型浪潮席卷全球&#xff0c;不仅众多程序员计划转型入局分一杯羹&#xff0c;零基础小白也渴望抓住这波时代机遇。但大模型知识体系繁杂庞大&#xff0c;不少学习者刚入门就陷入“不知从何学起”“学了就忘”的困境。本文基于系统学习框架&#xff0c;精准对标新手痛…

作者头像 李华
网站建设 2026/4/18 8:38:34

巧用Node.js REPL自定义提示符和命令技巧

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 目录 巧用Node.js REPL&#xff1a;深度定制提示符与命令的进阶技巧 一、为何深度定制REPL&#xff1f;超越“临时测试”的认知边…

作者头像 李华
网站建设 2026/4/18 10:04:23

2026年1月GEO优化赛道:AI搜索排名服务商全景解析

在当今数字化的时代&#xff0c;AI搜索优化排名对于企业品牌的曝光和业务拓展至关重要。2026年1月&#xff0c;GEO优化赛道竞争激烈&#xff0c;众多服务商纷纷崭露头角&#xff0c;其中大麦GEO优化系统脱颖而出。大麦GEO优化系统是南京静好房科技自主研发的GEO优化软件工具&am…

作者头像 李华
网站建设 2026/4/18 8:51:12

计算机小程序毕设实战-基于微信小程序的书院预约系统的设计与实现基于springboot+vue的微信小程序的书院书吧预约系统的设计与实现【完整源码+LW+部署说明+演示视频,全bao一条龙等】

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

作者头像 李华
网站建设 2026/4/18 8:48:32

小程序毕设选题推荐:基于微信小程序的书院预约系统的设计与实现基于springboot+vue的微信小程序的书院预约系统的设计与实现【附源码、mysql、文档、调试+代码讲解+全bao等】

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

作者头像 李华
网站建设 2026/4/18 8:51:54

螺旋线代码怎么写(例题)

代码思路可以观察到走相同距离的不同方向有俩&#xff0c;螺旋线方向为右下左上&#xff0c;按观察所得可写代码。#include<bits/stdc.h> #define int long long using namespace std;const int N1e310;int dx[]{0,1,0,-1}; int dy[]{1,0,-1,0};int a[N][N];void solve(…

作者头像 李华