Linux 中的 Process Group 和 Session(上)

简介: Linux 中的 Process Group 和 Session

使用了这么多年的 Ubuntu, 自以为 Linux 下进程的概念已经很熟悉了, 然而发现进程组(Process Group)和会话(Session)两个概念日常并不会接触很多, 平时也没有注意, 导致今天遇到一个问题还想了半天才想明白.

看了一些讲进程控制的书和文章, 感觉都比较老了, 不少都还在讲 double fork 的原理及意义, 而现实是 systemd 已经接管了几乎整个 Linux 世界, double fork 这种东西真的不应该存在了, 至少在新的程序中不应该再使用了, 所以有了这篇文章.

引子--问题

我们知道在命令行运行的前台命令, 可以随时通过 Ctrl-C 关闭掉. 原理很简单, 当我们按下 Ctrl-C 的时候, shell 进程会向前台进程发送一个 SIGINT 信号, 进程收到 SIGINT 的默认操作就是退出. 按照这个思路出发, 在 fork 之后, 如果按下 Ctrl-C 应该只有主进程会关闭, 而子进程应该继续运行, 实际上并不是这样的, 两个进程都收到了 SIGINT 信号.

import os
import sys
import time
def child():
    while True:
        try:
            sys.stdout.write("child process\n")
            sys.stdout.flush()
            time.sleep(5)
        except KeyboardInterrupt:
            sys.stdout.write("child sigint\n")
            sys.stdout.flush()
            sys.exit()
def main():
    while True:
        try:
            sys.stdout.write("main process\n")
            sys.stdout.flush()
            time.sleep(4)
        except KeyboardInterrupt:
            sys.stdout.write("main sigint\n")
            sys.stdout.flush()
            sys.exit()
pid = os.fork()
if pid != 0:
    main()
else:
    child()

当我们按下 Ctrl-C 的时候

main process
child process
main process
child process
^Cchild sigint
main sigint

也就是说上述说法并不是完全正确的. 实际上, SIGINT 并不只会发送给前台进程, 而是发送给前台进程组中的每一个进程. 那么什么是进程组呢?

目录
相关文章
|
11月前
|
监控 Linux
Linux systemd 服务启动失败Main process exited, code=exited, status=203/EXEC
通过以上步骤,可以有效解决 systemd 服务启动失败并报错 `Main process exited, code=exited, status=203/EXEC` 的问题。关键在于仔细检查单元文件配置、验证可执行文件的有效性,并通过日志分析具体错误原因。确保可执行文件路径正确、文件具有执行权限,并且可以独立运行,将有助于快速定位和解决问题。
4760 7
|
Unix Docker 容器
使用docker 启动naocs 报错出现:standard_init_linux.go:241: exec user process caused "exec format error"
```markdown Error in Docker container startup: "standard_init_linux.go:241: exec user process caused \"exec format error\"". Occurred at 2024-06-29 09:26:19.910, followed by a failed hook with a syslog delivery error at 09:27:20.193. Seeking solutions from experts. ```
|
Unix Shell Linux
Linux 中的 Process Group 和 Session(下)
Linux 中的 Process Group 和 Session
429 0
|
Linux
Linux系统init: prefdm main process terminated with status问题
Linux系统init: prefdm main process terminated with status问题
748 0
|
存储 缓存 固态存储
【Linux】基础IO --- 内核级和用户级缓冲区、磁盘结构、磁盘的分治管理、block group块组剖析…
【Linux】基础IO --- 内核级和用户级缓冲区、磁盘结构、磁盘的分治管理、block group块组剖析…
linux中的usermod 修改用户、groupadd 新增组、groupdel 删除组、groupmod 修改组、cat /etc/group 查看创建了哪些组llinux中的userdel 删除用户、who 查看登录用户信息、sudo 设置普通用户具有 root 权限
linux中的usermod 修改用户、groupadd 新增组、groupdel 删除组、groupmod 修改组、cat /etc/group 查看创建了哪些组llinux中的userdel 删除用户、who 查看登录用户信息、sudo 设置普通用户具有 root 权限
linux中的usermod 修改用户、groupadd 新增组、groupdel 删除组、groupmod 修改组、cat /etc/group 查看创建了哪些组llinux中的userdel 删除用户、who 查看登录用户信息、sudo 设置普通用户具有 root 权限
|
Ubuntu Linux 应用服务中间件
OCI runtime exec failed: exec failed: container_linux.go:380: starting container process caused: exec: "ip": executable file not found in $PATH: unknown (Docker容器没有ip addr命令:exec ip addr 报错)
OCI runtime exec failed: exec failed: container_linux.go:380: starting container process caused: exec: "ip": executable file not found in $PATH: unknown (Docker容器没有ip addr命令:exec ip addr 报错)
4409 0
|
Linux 开发工具 数据安全/隐私保护
8.5 Linux /etc/group
/ect/group 文件是用户组配置文件,即用户组的所有信息都存放在此文件中。
244 0
8.5 Linux /etc/group
|
Linux 应用服务中间件 数据安全/隐私保护
Linux习题练习-03(users & group、tar、gzip、yum源配置)
Linux习题练习-03(users & group、tar、gzip、yum源配置)
205 0
|
3月前
|
Linux 应用服务中间件 Shell
二、Linux文本处理与文件操作核心命令
熟悉了Linux的基本“行走”后,就该拿起真正的“工具”干活了。用grep这个“放大镜”在文件里搜索内容,用find这个“探测器”在系统中寻找文件,再用tar把东西打包带走。最关键的是要学会使用管道符|,它像一条流水线,能把这些命令串联起来,让简单工具组合出强大的功能,比如 ps -ef | grep 'nginx' 就能快速找出nginx进程。
二、Linux文本处理与文件操作核心命令