会话session概念解析
会话session概念解析要理解“会话”Session我们得把它放在 Linux/Unix 的进程管理树里看。会话Session是一个或多个“进程组”Process Group的集合它是作业控制Job Control的基本单元。为了帮你彻底搞懂我们把进程的层级关系从下到上捋一遍1. 进程的“三层层级结构”进程Process最底层的执行单元。进程组Process Group一群相关进程的集合比如grep命令加上它的管道兄弟。进程组里有一个组长进程PGID PID。会话Session一个或多个进程组的集合。会话里有一个会长进程SID PID。2. 会话Session最核心的三个特性一个会话之所以重要是因为它捆绑了“终端”和“作业控制”拥有一个控制终端Controlling Terminal绝大多数会话都关联着一个终端如 SSH 窗口、物理串口。当你在终端敲命令时输入和输出都是通过这个会话传递的。前台与后台Foreground / Background会话里的进程组被分为两类。前台进程组能接收键盘信号如CtrlC和多个后台进程组默默运行。信号传导当控制终端断开比如 SSH 断了内核会向该会话中的所有进程发送SIGHUP信号默认会让它们全部退出。3.setsid()到底干了什么当你调用setsid()时系统会创建一个全新的、独立的会话。它做了三件“斩断联系”的事该进程变成新会话的“会长”SID 该进程PID。该进程变成新会话里第一个进程组前台组的“组长”。最关键剥离控制终端。如果该进程之前有父进程传下来的终端它会彻底断开变成无终端No Controlling TTY的孤儿会话。4. 为什么要用setsid()——典型的“守护进程Daemon”套路最经典的场景就是创建守护进程如 Nginx、MySQL 后台服务。如果不调用setsid()你的进程隶属于 SSH 会话。一旦你关掉窗口SSH 会话结束系统发来SIGHUP你的服务就被杀死了。调用setsid()后进程自成一派新会话和原来的终端窗口彻底“离婚”。即使你退出登录这个新会话依然存活不受终端关闭影响从而常驻后台。5. 直观的类比生活化理解你可以把进程层级想象成一个“公司”进程 单个员工做具体任务。进程组项目组组长带着组员一起干活比如前端组。会话Session整个公司。setsid()的作用就是你带着手下集体辞职重新注册一家新公司新会话并且把原来的办公大楼控制终端的钥匙交回去。从此原来的大楼拆不拆SSH断不断都跟你这家新公司毫无关系了。特别注意调用限制setsid()不能由进程组组长调用否则会报错EPERM。所以标准的守护进程写法是先fork()一个子进程让父进程退出让子进程变成孤儿然后子进程调用setsid()因为子进程肯定不是进程组组长。如果你是在写脚本常用的nohup命令本质上也是通过剥离SIGHUP信号并配合setsid()类似机制来达到后台驻留效果的。setsid函数详解setsid()是 Linux 系统中一个关键的系统调用它的核心作用是创建一个全新的会话Session并使调用进程成为这个新会话的领导者Session Leader。以下是关于setsid()函数的详细解读。 函数原型#include unistd.h pid_t setsid(void);头文件:unistd.h返回值: 成功时返回新会话的ID也就是调用进程的PID失败时返回(pid_t)-1并设置全局变量errno以指示错误。⚙️ 核心功能与原理调用setsid()会触发一系列连锁反应其核心动作包括创建新会话 (New Session)调用进程成为新会话的领导者Session Leader。新会话的ID (SID) 被设置为调用进程的PID。创建新进程组 (New Process Group)调用进程同时成为新进程组的组长Group Leader。新进程组的ID (PGID) 也被设置为调用进程的PID。脱离控制终端 (No Controlling Terminal)新创建的会话最初没有控制终端。这使进程彻底与原来的终端“断绝关系”是守护进程不受终端关闭影响的关键-。调用成功后调用进程是其新会话和新进程组中的唯一成员。⚠️ 使用限制与错误setsid()最重要的限制是调用进程不能是进程组的组长Process Group Leader。如果违反此规则调用将失败并返回-1同时errno被设置为EPERM(操作不允许)。为什么有这个限制这是为了防止进程组组长“独自”加入新会话而把同组的其他进程“遗留”在原会话中从而破坏“会话 - 进程组 - 进程”这种清晰的两层树形结构。 典型应用场景创建守护进程 (Daemon)setsid()最经典的用途是创建守护进程即那些在后台长期运行、不受用户登录和注销影响的服务程序如 Web 服务器、数据库等。一个标准的创建守护进程的步骤通常如下fork()创建子进程父进程退出 (exit())这步让子进程变成孤儿进程并确保子进程不是一个进程组的组长为安全调用setsid()做准备。子进程调用setsid()子进程至此成为一个全新会话的领导者完全独立出来-。可选更改工作目录 (chdir(/))将工作目录改为根目录避免占用其他文件系统导致无法卸载-。可选重设文件权限掩码 (umask(0))给予守护进程更大的文件创建权限控制。可选关闭不必要的文件描述符释放从父进程继承来的标准输入、输出、错误等资源。代码示例 (C语言)下面是一个创建守护进程的最小化代码框架#include unistd.h #include stdlib.h #include stdio.h int main() { pid_t pid; // 1. fork() 创建子进程 pid fork(); if (pid 0) { perror(fork); exit(EXIT_FAILURE); } // 父进程退出 if (pid 0) { exit(EXIT_SUCCESS); } // 2. 子进程调用 setsid()成为新会话的领导者 if (setsid() 0) { perror(setsid); exit(EXIT_FAILURE); } // 3. 可选更改工作目录至根目录 if (chdir(/) 0) { perror(chdir); exit(EXIT_FAILURE); } // 4. 可选重设文件权限掩码 umask(0); // 5. 可选关闭标准输入、输出、错误 close(STDIN_FILENO); close(STDOUT_FILENO); close(STDERR_FILENO); // 6. 在这里编写守护进程的核心工作逻辑 while (1) { // 守护进程持续运行的任务... sleep(30); } exit(EXIT_SUCCESS); } 其他注意事项继承性通过fork()创建的子进程会继承父进程的会话ID。而通过exec()系列函数执行的程序其会话ID会被保留。SIGHUP信号当会话领导进程终止时内核会向该控制终端的前台进程组中的所有进程发送SIGHUP信号。相关函数getsid()用于获取进程的会话IDsetpgid()用于设置进程组ID。 总结setsid()是 Linux 进程管理中一个精准而强大的工具。它通过让进程“自立门户”创建新会话和新进程组并“切断联系”脱离控制终端实现了进程的完全独立。这正是所有守护进程能够稳定、持久地在后台运行的基础。setsid命令详解setsid本身就是一个Linux终端命令。它和setsid()函数功能一致用于在一个新的会话Session中运行指定的程序。这个命令通常已预装在大多数Linux发行版中。基本用法与选项命令的基本格式是setsid [选项] 程序 [程序参数]。一些常用的选项包括选项说明-f,--fork强制创建子进程。如果当前进程已经是会话组长setsid会失败此选项可强制其通过fork创建子进程来执行任务。-w,--wait等待程序结束。使setsid命令等待所运行的程序退出并返回该程序的退出状态码。-c,--ctty使用当前终端。让新会话将当前的终端作为控制终端。常见用法举例1. 在新会话中运行程序最基本用法# 让 my_script.sh 在一个全新的、没有控制终端的会话中运行 setsid my_script.sh执行后my_script.sh会立即与当前终端脱离。2. 结合输出重定向实现“永久后台”运行这是最常用的方式可以完全忽略终端输出避免干扰# 将标准输出和错误输出都丢弃 setsid my_long_task.sh /dev/null 21这样即使你关闭终端my_long_task.sh也会在后台持续运行。3. 等待程序执行完毕如果你需要在一个脚本中等待setsid启动的任务完成后再继续可以使用-w选项# 等待 data_process 程序结束并获取其退出码 setsid -w data_process --inputdata.txt if [ $? -eq 0 ]; then echo 数据处理成功 fi与setsid()函数的关系终端命令setsid本质上就是C语言库函数setsid()的一个便捷封装。它让你无需编写和编译C代码就能在Shell环境中直接获得“创建新会话”的能力-。常见应用场景与注意替代nohup与nohup类似setsid也能让进程无视SIGHUP信号在终端关闭后继续运行-。但setsid更“彻底”它直接创建了一个全新的会话而nohup只是让进程忽略挂断信号。创建守护进程它是创建守护进程Daemon的经典方法之一。注意setsid命令属于util-linux软件包。如果你的系统提示找不到该命令可以通过包管理器安装例如在Debian/Ubuntu上使用sudo apt install util-linux。

相关新闻

MySQL事务日志系统:undo log、redo log与bin log深度解析

MySQL事务日志系统:undo log、redo log与bin log深度解析

1. 事务日志系统核心架构解析在数据库系统中,事务的ACID特性离不开三大日志文件的协同工作。作为从业15年的数据库内核开发者,我见证过太多因日志配置不当导致的生产事故。今天我们就深入剖析undo log、redo log和bin log的运作机制,以及它们…

2026/10/7 16:44:04 阅读更多 →
Daft开发者指南:贡献代码与扩展功能的最佳实践

Daft开发者指南:贡献代码与扩展功能的最佳实践

Daft开发者指南:贡献代码与扩展功能的最佳实践 【免费下载链接】daft Render probabilistic graphical models using matplotlib 项目地址: https://gitcode.com/gh_mirrors/daft1/daft Daft是一个使用matplotlib渲染概率图模型(PGM)的…

2026/10/6 4:09:17 阅读更多 →
Growler高级特性:探索协程中间件与异步模板渲染

Growler高级特性:探索协程中间件与异步模板渲染

Growler高级特性:探索协程中间件与异步模板渲染 【免费下载链接】Growler A micro web-framework using asyncio coroutines and chained middleware. 项目地址: https://gitcode.com/gh_mirrors/gr/Growler Growler是一个基于asyncio协程和链式中间件的微型…

2026/10/7 13:51:15 阅读更多 →

最新新闻

Spring Security 6 + JWT多终端认证实战:会话管理与安全加固

Spring Security 6 + JWT多终端认证实战:会话管理与安全加固

1. 项目概述:多终端认证到底难在哪先说结论:这两年做后端接口,几乎每个系统都得碰认证授权。尤其是项目从单一Web端扩展到App、小程序、H5、桌面客户端之后,认证这块立刻变成最容易出问题的地方。我们当时面临的场景很典型——用户…

2026/10/7 16:43:28 阅读更多 →
自己动手写JWT解码工具:原理、实现与调试实战

自己动手写JWT解码工具:原理、实现与调试实战

1. 为什么要自己写一个JWT解码工具 1.1 在线解码网站的三个痛处 做了几年后端接口开发,JWT这个东西几乎天天见。用户登录后发一个令牌,前端存起来,每次请求带上,后端验一下签名放行。本来这个流程很顺,但一到联调和排…

2026/10/7 16:43:27 阅读更多 →
32G U盘文件系统对比:exFAT、ext4还是NTFS?实测小文件性能差距

32G U盘文件系统对比:exFAT、ext4还是NTFS?实测小文件性能差距

玩U盘的人应该都有过这种体验:同一个U盘,拷贝电影和拷贝一堆小文件,速度完全是两个世界。前者能跑到写入80MB/s,后者直接掉到个位数,剩余时间永远在跳。我前阵子专门折腾了一轮32G优盘的文件系统选择问题,把…

2026/10/7 16:43:26 阅读更多 →
Mac上用Docker部署MySQL:从安装到主从复制的完整实战指南

Mac上用Docker部署MySQL:从安装到主从复制的完整实战指南

1. 为什么我把MySQL搬进了Docker:Mac本地安装的四个真实痛点 先说说我自己的经历。早几年我用Mac做开发,项目里需要MySQL,第一反应肯定是去官网下个dmg安装包,或者用Homebrew执行一条 brew install mysql 。听起来很简单对吧&am…

2026/10/7 16:43:26 阅读更多 →
UE C++ UFUNCTION()参数全解析:从蓝图调用到RPC网络同步

UE C++ UFUNCTION()参数全解析:从蓝图调用到RPC网络同步

写UE C搞了几年,我觉得 UFUNCTION() 大概是出现频率最高、也最容易被随手糊弄过去的宏。你说它不是技术难点吧,一旦参数选错,轻则蓝图里找不到节点,重则多人联机时回调压根不触发,而且还不报错。我前阵子整理项目里的…

2026/10/7 16:43:25 阅读更多 →
博世维修AI智能体:故障工单自动编写与旧案例智能检索实战

博世维修AI智能体:故障工单自动编写与旧案例智能检索实战

1. 从一张维修工单说起:这个智能体到底在解决什么问题干过家电售后的人都知道,维修工单这东西看着简单,写起来要命。一台博世冰箱报修,用户描述是“冷藏室不冷,冷冻室正常,显示屏没报错”,你上门…

2026/10/7 16:42:25 阅读更多 →

日新闻

ROS2机械臂仿真与运动控制:从URDF建模到Gazebo实战全解析

ROS2机械臂仿真与运动控制:从URDF建模到Gazebo实战全解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 1:01:58 阅读更多 →
用浏览器直接改ESP32的WiFi密码:NVS键值配置工具设计与实现

用浏览器直接改ESP32的WiFi密码:NVS键值配置工具设计与实现

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 1:02:00 阅读更多 →
芯片封装缺陷检测:扫描声学显微镜(SAT)原理与实操指南

芯片封装缺陷检测:扫描声学显微镜(SAT)原理与实操指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 1:02:00 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 14:34:12 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 14:34:13 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 9:29:10 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 14:34:12 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 11:43:46 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 13:34:55 阅读更多 →