众所周知,在Linux系统中,所有的进程都是有父子或者堂兄关系的,除了初始进程init,没有任何进程是完全独立的。
除了init进程,系统中每个进程都会有一个父进程,新的进程不是被全新创建的,而是复制父进程的现有资源而生成的。
当我们在shell下运行一个可执行程序,就产生了一个新的进程。那么,问题来了,谁是这个新的进程的父进程?
首先看看下面的代码:
#include <iostream>
#include <sys/types.h>
#include <unistd.h>
using namespace std;
int main()
{
while(1)
{
pid_t pid = getpid(); // 获取当前进程ID
pid_t fpid = getppid(); // 获取父进程ID
cout << "pid = " << pid << endl;
cout << "ppid = " << fpid << endl;
cout << "=================" << endl;
sleep(5); // 每隔5s打印一次
}
return 0;
}
以上的程序实现每隔5s打印当前程序的PID号和父进程的PID号,使用g++编译成可执行文件,在shell下执行:
可以看到,程序已经成功的执行,并且打印当前进程PID和父进程的PID。此时,我们知道当前进程确实存在父进程,而且PID号也已经知晓。但是,这个父进程到底是谁呢?知道个号码也不知道其身份呀。
这个时候,让程序继续执行,我们打开另一个shell,执行pstree命令。pstree命令是查看系统中运行的进程之间的关系。
如图,pstree执行结果的一部分截图:
我们在pstree的查询结果中,找到当前可执行程序的名称,就能知道它所属的父进程是谁。
如上图,我们可以知道,当前可执行程序test,它的父进程是fish,fish是shell中的一种,类似于bash。(推荐大家安装使用哦,挺好用的)。
所以,当我们在终端中运行一个可执行程序,它的父进程就是当前运行的shell程序。
另外,重要的一点,我们可以使用pstree查看系统中所有进程的关系。
谢谢阅读。