Linux下如何查看进程:
(1)ps -aux
(2) ps -ef
(3)ps axj
(4)top
(5)pstree
信号
- 什么是进程
程序的一次动态执行过程,包括创建、调度、消亡
-
- 进程和程序的区别
程序(a.out)是静态的,它是一些保存在磁盘上的指令的有序集合,没有任何执行的概念
进程(./a.out)是一个动态的概念,它是程序执行的过程,包括创建、调度和消亡
-
- 进程是程序执行和资源(内存)管理的最小单位
为什么进程是资源管理的最小单位?
因为每一个进程都有0~4G的虚拟内存
-
- 如何区分不同的进程-->PID(子进程号)、PPID(父进程号)
进程是由进程创建的,我们有父进程、子进程
- 进程的类型
- 交互进程
该类进程是由shell控制和运行的。交互进程既可以在前台运行,也可以在后台运行。
前台运行:
后台运行:
(2)批处理进程
该类进程不属于某个终端,它被提交到一个队列中以便顺序执行。
(3)守护进程
该类进程在后台运行。它一般在Linux启动时开始执行,系统关闭时才结束。
- 进程的状态
- 运行态
此时进程正在运行,或者准备运行
- 等待态
此时进程在等待一个事件的发生或某种系统资源。
可中断
不可中断
- 停止态
此时进程被中止。
(4)死亡态
这是一个已终止的进程,但还在进程向量数组中占有一个task_struct(PCB)结构。
PCB结构(内核空间):包括进程控制块本身、打开的文件表象、当前目录、当前终端信息、线程基本信息、可访问的内存地址空间、PID、PPID、UID、EUID等,也就是说,内核通过PCB可以访问到进程的所有资源
- 进程的模式
5、调度进程
- 进程相关的系统调用
5.1 创建进程
注意:fork函数是父进程调用的,在父进程返回值之前,子进程已经创建好了,父进程和子进程的返回值是不一样的
在子进程创建成功之后,它会和父进程抢占资源,存在竞争关系,谁先调度,有调度算法决定
加上换行符之后,缓冲区刷新
5.2 getpid()和getppid()
5.2.1 getpid()
头文件:
#include <sys/types.h>
#include <unistd.h>
函数原型:
pid_t getpid(void);
函数功能:获取进程的ID号
返回值:返回调用进程的PID号
pid_t getppid(void);
函数功能:获取父进程的PID号
./a.out(子进程)-->./a.out(父进程)-->bash-->terminal-->systemd-->init
5.3 进程退出
exit、_exit、return(main函数中的return)
注意:(1)exit会刷新缓冲区
(2)_exit不会刷新缓冲区
5.4 wait 和 waitpid
5.4.1 wait函数
调用该函数使进程阻塞,直到任一个子进程结束或者是该进程接收到了一个信号为止。如果该进程没有子进程或者其子进程已经结束,wait函数会立即返回
5.4.2 waitpid
获取子进程退出的状态:
- 孤儿进程
父进程先退出,子进程被systemd进程收养,变为后台进程
- 僵尸进程
子进程先于父进程退出,父进程没有回收子进程的资源(task_struct),此时子进程就变为僵尸进程
注意:如果父进程一直不退出,子进程就一直保持僵死状态,直到父进程退出,task_struct就会被systemed回收
8、exec函数族
不想让子进程执行父进程的代码段
l:表示列表
v:向量(数组)
p:系统会自动从环境变量“$PATH”所包含的路径中进行查找(不用添加路径)