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

目录
相关文章
|
16天前
|
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. ```
|
10月前
|
Unix Shell Linux
Linux 中的 Process Group 和 Session(下)
Linux 中的 Process Group 和 Session
126 0
|
Linux
Linux系统init: prefdm main process terminated with status问题
Linux系统init: prefdm main process terminated with status问题
281 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 报错)
3561 0
|
Linux 开发工具 数据安全/隐私保护
8.5 Linux /etc/group
/ect/group 文件是用户组配置文件,即用户组的所有信息都存放在此文件中。
127 0
8.5 Linux /etc/group
|
Linux 应用服务中间件 数据安全/隐私保护
Linux习题练习-03(users & group、tar、gzip、yum源配置)
Linux习题练习-03(users & group、tar、gzip、yum源配置)
137 0
|
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.
1209 0
|
1天前
|
关系型数据库 MySQL Linux
Linux命令systemctl详解
`systemctl`是Linux系统用于管理systemd服务的核心命令,它与systemd守护进程交互,实现启动、停止、重启服务及查看服务状态等功能。主要参数包括`start`、`stop`、`restart`、`status`、`enable`和`disable`等。例如,启动Apache服务使用`systemctl start httpd.service`,查看服务状态用`systemctl status <service>`。使用时需注意权限,服务名通常以`.service`结尾,但命令中可省略。最佳实践包括利用tab键补全、定期查看服务状态和合理配置服务自启。