🖥️ 前言 🖥️
在『 Linux 』进程概念 中了解到了操作系统对于进程的管理也是使用了"先描述后组织的方式",且提到可以使用以下方式来查看进程:
ps
只能查看当前渠道内的进程,若是需要查看所有进程应该加上修饰,即使用ps axj | grep id_PID
来查看进程;top
top
命令更像是Windows下的任务管理器,一般用来观察内存当中占用较大的那个进程;ls /proc
使用ls
命令以目录的形式来查看进程;
🖥️ 通过系统调用获取进程标识符 🖥️
💻 进程标识符PID
在Linux中不仅可以使用以上方式查看进程,也可以通过系统调用的方式使程序获取到当前进程标识符;
在Linux中有一个头文件为这个头文件提供了一些关于系统调用和底层操作的有关函数;这个头文件包含了许多操作系统接口访问的重要功能;
而在这个头文件中存在个函数,这个函数为pid_t getpid()
,其中这个函数的返回值类型pid_t
可以看成是一个unsigned int
类型;
该函数能够使该程序获取自身的进程标识符PID
;
示例:
#include<iostream> #include<unistd.h> using namespace std; void test1(){ while(1){ cout<<"the PID is "<<getpid()<<endl;//打印出该进程的PID cout<<"##########################"<<endl; sleep(1); } } int main() { test1(); return 0; }
当运行这个程序之后这个进程将以间隔1s
的速度打印出以上内容,同时带上PID;
使用ps
查看该进程的状态:
$ ps axj | head -1 && ps axj | grep 32391 | grep -v grep PPID PID PGID SID TTY TPGID STAT UID TIME COMMAND 31335 31336 31336 31336 pts/1 32391 Ss 1002 0:00 -bash 31336 32391 32391 31336 pts/1 32391 S+ 1002 0:00 ./myproc
当使用kill -9 32391
命令时向该进程发送9号信号将该进程杀死;
the PID is 32391 ########################## the PID is 32391 ########################## the PID is 32391 ########################## Killed $
💻 父进程标识符PPID
在该头文件中一样存在着一个函数可以使得该程序获取当前进程的父进程的PID,也就是PPID;
#include<iostream> #include<unistd.h> using namespace std; void test1(){ while(1){ cout<<"the PID is "<<getpid()<<endl;//打印出该进程的PID cout<<"the PPID is "<<getppid()<<endl;//打印出该进程父进程的PID cout<<"##########################"<<endl; sleep(1); } } int main() { test1(); return 0; }
当程序运行时:
the PID is 886 the PPID is 31336 ########################## the PID is 886 the PPID is 31336 ########################## the PID is 886 the PPID is 31336 ##########################
使用ps
也能直接的观察到该进程的PID与PPID从而进行验证;
ps axj | head -1 && ps axj | grep 886 | grep -v grep PPID PID PGID SID TTY TPGID STAT UID TIME COMMAND 31336 886 886 31336 pts/1 886 S+ 1002 0:00 ./myproc 31335 31336 31336 31336 pts/1 886 Ss 1002 0:00 -bash
然而从该处可以直接看到其实该进程的父进程就是一个-bash
命令行解释器;
『 Linux 』使用fork函数创建进程与进程状态的查看(下)https://developer.aliyun.com/article/1424456