文中涉及到的缩写如下:
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
本文通过实验演示了进程间的关系,包括父进程、子进程、进程组及会话等概念,并详细解析了不同进程间的ID关联,如PID、PPID、PGID和SID,通过具体的代码示例和命令行操作展示进程的创建及其属性。
1129

被折叠的 条评论
为什么被折叠?



