补充知识点
1. tty 命令
- 全称
tty = Teletype(电传打字机,早期电脑的输入输出设备) - 命令作用
显示你当前正在使用的终端设备文件名。

当我们执行ps aux时,如果有多个终端同时开的情况,就会无法找到想要杀死进程的进程 ID ,这里输出结果TTY的那一列就对应着tty命令打印的终端设备文件名,这样就可以准确杀死进程了。

进制的状态
进程状态反映进程执行过程的变化。这些状态随着进程的执行和外界条件的变化而转换。在三态模型中,进程状态分为三个基本状态,即就绪态,运行态,阻塞态。在五态模型中,进程分为新建态、就绪态,运行态,阻塞态,终止态。
三态模型

- 运行态:进程占有处理器正在运行。
- 就绪态:进程具备运行条件,等待系统分配处理器以便运行。当进程已分配到除 CPU 以外的所有必要资源后,只要再获得 CPU ,便可立即执行。在一个系统中处于就绪状态的进程可能有多个,通常将它们排成一个队列,称为就绪队列。
- 阻塞态:又称为等待 (wait) 态或睡眠 (sleep) 态,指进程不具备运行条件,正在等待某个事件的完成。
五态模型

- 新建态:进程刚被创建时的状态,尚未进入就绪队列。
- 终止态:进程完成任务到达正常结束点,或出现无法克服的错误而异常终止,或被操作系统及有终止权的进程所终止时所处的状态。进入终止态的进程以后不再执行,但依然保留在操作系统中等待善后。一旦其他进程完成了对终止态进程的信息抽取之后,操作系统将删除该进程。
进程相关命令
查看进程
ps 命令 :⽤于查看系统进程信息,process 的缩写。
- 常⽤参数组合 :
ps aux:显示所有⽤户进程详细信息。ps ajx:显示作业控制相关信息。
- 参数详解 :
ps:全称 Process Status ,进程状态。a:显示终端上的所有进程,包括其他用户的进程。u:显示进程的详细信息。x:显示没有控制终端的进程。j:列出与作业控制相关的信息。
ps aux 演示:

- 输出字段:
USER:进程所属⽤户PID:进程 ID%CPU:CPU使⽤率%MEM:内存使⽤率TTY:所属终端STAT:进程状态START:启动时间TIME:运⾏时间COMMAND:执⾏的命令
ps ajx 演示:

- 输出字段:
PPID:父进程 IDPID:进程 IDPGID:进程组 IDSID:会话 IDTTY:所属终端TPGID:前台进程组 IDSTAT:进程状态UID:用户 IDTIME:运行时间COMMAND:执行的命令
STAT 状态码
| 状态字符 | 含义说明 |
|---|---|
| D | 不可中断 (通常为 IO 操作) |
| R | 正在运行,或在队列中的进程 |
| S(大写) | 处于休眠状态 |
| T | 停止或被追踪 |
| Z | 僵尸进程 |
| W | 进入内存交换(从内核2.6开始无效) |
| X | 死掉的进程 |
| < | 高优先级 |
| N | 低优先级 |
| s | 包含子进程 |
| + | 位于前台的进程组 |
实时显示进程动态
top 命令 :动态显示进程信息,默认按 CPU 使用率从高到低排序,三秒刷新一次。
可以在使用 top 命令时加上 -d 来指定显示信息更新的时间间隔,在 top 命令执行后,可以按以下按键对显示的结果进行排序:
| 快捷键 | 功能说明 |
|---|---|
| M | 根据内存使用量排序 |
| P | 根据 CPU 占有率排序 |
| T | 根据进程运行时间长短排序 |
| U | 根据用户名来筛选进程 |
| K | 输入指定的 PID 杀死进程 |
杀死进程
kill命令 :终⽌指定进程。
bash
kill [-signal] pid
常用方式:
kill --l:列出所有信号。kill --SIGKILL:强制终止进程。kill -9:强制终止进程 (SIGKILL是信号 9 的宏)。killall name:根据进程名杀死进程。
注意事项:
- 普通⽤户只能终⽌⾃⼰的进程。
- 前台进程需要
-9参数强制终⽌。 - 终端进程终⽌会导致连接断开。
后台进程:
- 命令后加
&可使进程在后台运⾏。 - 如果进程有输出仍会输出到当前终端,但此时可以在终端执行其他命令。
创建一个 a.c 程序:
c
#include <stdio.h>
#include <unistd.h>
int main()
{
while(1)
{
printf("hello\n");
sleep(5);
}
return 0;
}
编译并后台运行该程序:
bash
gcc a.c
./a.out &
这里可以看到终端依然在输出,但当我杀死无限循环的进程后就不再输出 hello 了:

进程号和相关函数
- 每个进程都由进程号来标识,其类型为
pid_t(整型),进程号的范围:0~32767。
进程号总是唯一的,但可以重用。当一个进程终止后,其进程号就可以再次使用。 - 任何进程(除 init 进程)都是由另一个进程创建,该进程称为被创建进程的父进程,
对应的进程号称为父进程号(PPID)。 - 进程组是一个或多个进程的集合。他们之间相互关联,进程组可以接收同一终端的各
种信号,关联的进程有一个进程组号(PGID)。默认情况下,当前的进程号会当做当
前的进程组号。 - 进程号和进程组相关函数:
pid_t getpid(void); 获取当前进程 IDpid_t getppid(void); 获取父进程 IDpid_t getpgid(pid_tpid); 获取进程组 ID