图解终端、会话、 进程组、进程ID之间的关系

本文通过实验演示了进程间的关系,包括父进程、子进程、进程组及会话等概念,并详细解析了不同进程间的ID关联,如PID、PPID、PGID和SID,通过具体的代码示例和命令行操作展示进程的创建及其属性。

文中涉及到的缩写如下:

PID: 进程(process) ID

PPID:父进程(parent process) ID,创建某进程的父进程

PGID:进程组(process group) ID,进程所在的进程组

SID:会话(session )ID,进程所隶属的会话

文中a.out和pidTest对应的代码如下:

#include <iostream>
#include <unistd.h>
int main()
{
    fork(); //创建子进程
    while(1);
    return 0;
}

实验方法:

开一个terminal,运行三个a.out,得到3个进程组,6个a.out进程(3个进程和3个子进程):

关系图如下:

 解释如下:

  • bash的PPID是terminal进程ID;
  • bash的PGID,SID都是bash自己的PID;
  • 3个a.out进程组所有6个进程的SID都是bash的PID;
  • 3个a.out中fork()出来的子进程的父进程PPID为对应的3个a.out进程ID;
  • 3个a.out进程组中的各个父进程PID会成为该进程组中所有进程的PGID;

进程树pstree关系如下(图中+号表示可展开的意思,相当于已经收回的下拉菜单):

 通过ps命令验证如下:

进一步实践:

单独启动一个terminal,查看pstree:

systemd进程生成子进程gnome-terminal-,然后有生成bash子进程和5*[(gnome-terminal-)]子进程,而bash进程又生成了pstree.x11子进程;

启动pidTest程序(和上述a.out相同):

 在bash进程中,又生成一个子进程pidTest,而pidTest又派生出一个子进程pidTest。

查看上述各进程之间的关系:

 之间的关系一目了然:

  • systemd 进程(1787号)源自1号进程,,同时单独属于一个进程组;
  • gnome-terminal-进程(2748号)源自systemd进程(1787号),同时单独属于一个进程组和1个会话;
  • bash进程(2755号)源自gnome-terminal-进程(2748号),单独属于一个进程组和1个会话;
  • pidTest进程(2879号)源自bash进程(2755号),和子进程(2880号)同属于1个进程组和一个会话,会话为上述bash进程发起的会话;

关掉terminal之后,这些进程都不存在了。

参考链接:https://blog.youkuaiyun.com/21cnbao/article/details/103951854

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值