*在用户访问端口时,操作系统会形成对应的session,在其的内部进一步形成bash等进程
*一个会话只有一个前台进程,可以有多个后台进程,前台与后台进程的区别在于谁拥有键盘的使用权
*前台与后台进程都可以访问显示器但是后台无法访问标准输入获取数据
下面介绍相关接口
示例代码
前台运行
后台运行
查看后台进程:
在 Linux 系统中, jobs 是一个常用的 shell 命令,用于查看当前终端会话中在后台运行或暂停的作业(进程)
后台调前台:
- fg :不加参数时,默认操作 jobs 列表里带 + 标记(当前默认)的后台作业,将其移到前台执行。
- fg %作业号 :指定作业号(通过 jobs 查看的 [n] 编号),精准调对应后台作业到前台,例 fg %1 调作业号为 1 的任务。
恢复暂停任务:
按 Ctrl + Z 暂停前台任务 → 用 bg n 让它后台继续,或 fg %n 直接前台恢复执行。
观察图片
ppid及pid我们已经很熟悉,pgid(进程组id) sid(session id)则较为陌生。
进程组可以简单理解为:把多个相关的进程(比如一个程序启动后自己创建的子进程,或共同完成一项任务的多个进程)打包成的一个“小组”。
这个“小组”有两个关键特点:
- 每个小组有唯一的编号(进程组ID),通常用组里第一个创建的进程(组长)的ID来标识。
- 对这个小组操作(比如发停止信号),组里所有进程都会“收到”并响应。
比如你用命令启动一个程序,程序运行时又开了几个子进程,这些进程就自动组成一个进程组,方便统一管理(比如关闭终端时一起结束,或用快捷键统一暂停)。
远端登陆session退出时后台进程理论也退出,但是,远端情况实际上后台进程没有退出终止,而是托孤给了操作系统,但是仍然会受用户登陆影响其属性,想让后台进程不受到任何用户登录和注销的影响,就需要用到守护进程,原理是后台切会话
接口setsid:
setsid 是 Unix/Linux 系统中的一个系统调用(也有同名命令),核心作用是创建一个新的会话(session),并让调用它的进程成为这个会话的“领头进程”(session leader),同时脱离原有的进程组和控制终端。
简单理解
可以把它看作是让进程“独立门户”的操作:
- 原本进程可能属于某个进程组,受某个终端(比如命令行窗口)控制(终端关闭时,进程可能被终止)。
- 调用 setsid 后,进程会脱离原来的进程组,自己成立一个新的会话,并且不再有控制终端。这意味着它不会被终端的关闭、退出信号影响,适合作为后台服务(如守护进程)运行。
关键效果
1. 进程成为新会话的领头进程;
2. 进程成为一个新进程组的组长;
3. 进程与原控制终端彻底脱离(不再接收终端的信号,比如 Ctrl+C 不会终止它)。
典型用途
最常见的是创建“守护进程”(daemon),比如服务器程序。例如,后台运行的 Web 服务器、数据库服务等,通过 setsid 脱离终端控制,即使关闭启动它的终端,进程也能继续运行。
命令行中也可以直接使用 setsid 命令,比如 setsid sleep 1000 ,这个 sleep 进程会脱离当前终端,在后台独立运行。
手撕代码如下
分析
2:后台切会话时,不能是前台任务向绘画转变,因此我们需要保证,这个转会话的进程不能是第1个创建的,因此我们以紫进程进行切换就可以保证不是第1个进程进行切换
4:在进程的运行过程中,可能会出现许多的输出打印情况,而这些输出的内容,我们不需要他在显示器上呈现,因而我们就需要重载文件描述符0.1.2,将这些内容输进垃圾桶中,及/dev/null
系统接口
“daemon”(守护进程),它是运行在操作系统后台的一种特殊进程,主要特点和作用如下:
核心特点
- 后台运行:不依赖终端,启动后在后台持续工作,用户通常看不到它的界面。
- 自动启动:很多守护进程会随系统启动而运行,比如服务器的网络服务进程。
- 独立稳定:脱离终端控制,即使关闭启动它的终端,也能继续运行,且通常会长期稳定工作,除非被手动终止或系统关闭。
常见用途
- 提供系统服务:比如 Linux 中的 sshd (远程登录服务)、 httpd (网页服务器),Windows 中的“服务”(如自动更新服务)。
- 处理后台任务:比如定时任务调度( crond )、日志收集、网络数据监听等。
简单说,守护进程就像“隐形的服务员”,在后台默默处理系统或应用的各种任务,保证服务持续可用。