news 2026/2/12 14:45:51

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/2/7 4:03:58

2026年1月杭州GEO优化公司TOP3:AI赋能增长密钥

在数字化营销浪潮中&#xff0c;GEO优化成为企业提升线上竞争力的重要手段。特别是在杭州这个充满创新活力的城市&#xff0c;众多GEO优化公司崭露头角。下面为大家揭晓2026年1月杭州GEO优化公司TOP3&#xff0c;探寻AI赋能下的增长密钥&#xff0c;其中首推的是南京静好房科技…

作者头像 李华
网站建设 2026/2/5 12:16:03

一键搭建本地大模型,不挑环境、不挑配置,2000+多种开源大模型任意部署

一、Ollama介绍 2.1 基本介绍 Ollama是一个支持在Windows、Linux和MacOS上本地运行大语言模型的工具。它允许用户非常方便地运行和使用各种大语言模型,比如Qwen模型等。用户只需一行命令就可以启动模型。 主要特点包括: 跨平台支持Windows、Linux、MacOS系统。提供了丰富的…

作者头像 李华
网站建设 2026/2/8 17:30:06

利用基础大模型构建智能应用,AI工程化落地必读书籍,强烈推荐

本文推荐一本关于 AI 工程的书籍《AI Engineering: Building Applications with Foundation Models》&#xff0c;我认为是目前最好的关于基于大模型的 AI 工程的书籍&#xff0c;涵盖适合核心原理、开发流程与策略、数据集处理、提示工程、RAG、微调、智能体等内容&#xff0c…

作者头像 李华
网站建设 2026/2/7 7:05:32

无法读取到U盘文件

无法读取到U盘文件 adb shell "ps -A | grep update_engine" root 894 1 10869748 11056 0 0 S update_engine adb shell cat /proc/894/status |grep Groups Groups: 1000 1015 1023 1077 2001 3003 3010 adb shell &quo…

作者头像 李华
网站建设 2026/2/7 18:56:43

IDEA、Ncvicat 等 pojie 你懂的

Pojie 软件下载百度网盘下载&#xff1a; 链接: 通过网盘分享的文件&#xff1a; 链接: https://pan.baidu.com/s/1oPGXE0MjV4-grt--TSnIDw?pwd5201 提取码: 5201JDK 一键切换&#xff0c;其他的都可以一键pojie&#xff0c;无需额外操作。

作者头像 李华