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 并不只会发送给前台进程, 而是发送给前台进程组中的每一个进程. 那么什么是进程组呢?

目录
相关文章
|
8月前
|
Unix Shell Linux
Linux 中的 Process Group 和 Session(下)
Linux 中的 Process Group 和 Session
103 0
|
11月前
|
Linux
Linux系统init: prefdm main process terminated with status问题
Linux系统init: prefdm main process terminated with status问题
232 0
|
12月前
|
存储 缓存 固态存储
【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 报错)
3356 0
|
Linux 开发工具 数据安全/隐私保护
8.5 Linux /etc/group
/ect/group 文件是用户组配置文件,即用户组的所有信息都存放在此文件中。
110 0
8.5 Linux /etc/group
|
Linux 应用服务中间件 数据安全/隐私保护
Linux习题练习-03(users & group、tar、gzip、yum源配置)
Linux习题练习-03(users & group、tar、gzip、yum源配置)
132 0
|
Web App开发 负载均衡 应用服务中间件
|
Linux 应用服务中间件 Apache
docker linux centos tomcat session 共享问题
docker linux centos tomcat session 共享问题   37.6 安装一个 session 共享的 tomcat   37.6.0  准备工作 需要一个 curiousby/centos-ssh-root-java-tomcat 需要 commons-pool2-2.
1203 0
|
1天前
|
安全 网络协议 Linux
linux必学的60个命令
Linux是一个功能强大的操作系统,提供了许多常用的命令行工具,用于管理文件、目录、进程、网络和系统配置等。以下是Linux必学的60个命令的概览,但请注意,这里可能无法列出所有命令的完整语法和选项,仅作为参考