抱歉,您的浏览器无法访问本站

本页面需要浏览器支持(启用)JavaScript


了解详情 >

进程状态转换

三态模型:就绪态、运行态、阻塞态

五态模型:新建态、就绪态、运行态、阻塞态、终止态

image-20220402192345042

进程的状态

image-20220402220421337

查看进程 man ps

  1. ps aux / ajx (PPID 父进程的IP、 PID 进程的ID、PGID 进程组的ID、SID 绘话)
  2. a:显示终端上的所有进程, 包括其他用户的进程
  3. u: 显示进程的详细信息
  4. x: 显示没有控制终端的进程
  5. j: 列出与作业控制相关的信息

进程状态转换

STAT 参数意义:

​ D 不可中断 Uninterruptible(usually IO)

​ R 正在运行, 或在队列中的进程

​ S (大写) 处于休眠状态

​ T 停止或被追踪

​ Z 僵尸进程

​ W 进入内存交换 (从内核2.6开始无效)

​ X 杀掉的进程

​ < 高优先级

​ N 底优先级

​ s 包含子进程

​ + 位于前台的进程组

实时显示进程状态

​ top

​ 可以在使用 top 命令时加上 -d 来指定显示信息更新的时间间隔,在top命令执行后,可以按下按键对显示的结果排序

按 键

  • M 根据内存使用量排序
  • P 根据 CPU 占有率排序
  • T 根据进程运行时间长短
  • U 根据用户名来筛选进程
  • K 输入指定的 PID 杀死进程

杀死进程

  • kill [-signal] pid
  • kill -l 列出所有信号
  • kill -SIGKILL 进程ID
  • kill -9 进程ID // -l 信号 SIGKILL / -9 强制杀死
  • Killall name 根据进程名杀死进程

进程杀死测试

终端 测试 运行代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/*************************************************************************
> File Name: whil_lastiung.c
> Author: 秃头王
> Mail: 1658339000@qq.com
> Created Time: 2022年04月03日 星期日 10时39分54秒
************************************************************************/

#include<stdio.h>

int main() {
while(1) {
printf("秃头王\n");
sleep(1);
}
return 1;
}

image-20220403104258071

后台运行

./a.out &

进程号和相关函数

image-20220403114144755

pid 进程ID

ppid 父进程的ID

pgpid 用组的ID

进程创建 - man 2 fork

系统允许一个进程创建新进程,新进程即为子进程,子进程还可以创建新的子进程,形成讲程树结构模型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
/*************************************************************************
> File Name: fork.c
> Author: 秃头王
> Mail: 1658339000@qq.com
> Created Time: 2022年04月03日 星期日 14时14分05秒
************************************************************************/
/*
* #include <sys/types.h>
* #include <unistd.h>
*
* pid_t fork(void) ;
* 函数的作用: 用于创建子进程
* 返回值:
* fork()的返回值会返回2次 一次在父进程中、一次在子进程中。
* 在父进程中返回创建的子进程的 ID
* 在子进程中返回 0
* 如何区分子进程和父进程: 通过fork的返回值
* 在父进程中返回-1, 表示创建子进程失败, 并设置errno
*
* 父子进程之间的关系:
* 区别:
* 1. fork() 函数的返回值不同
* 父进程中: > 0 返回的子进程的ID
* 子进程中: = 0
* 2. pcb 中的一些数据
* 当前的进程id pid
* 当前的进程的父进程的id ppid
* 信号集
* 共同点:
* 某些状态下: 子进程中刚被创建出来, 还没有执行任何的写数据的操作
* - 用户区的数据
* - 文件描述表
* 父子进程对变量是不是共享的?
* - 刚开始时候, 是一样的共享。如果修改的数据就不共享了
* - 读时候共享(子进程被创建, 两个进程没有做任何的写的操作), 写时拷贝
*/

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>

int main() {

int num = 10;

pid_t pid = fork();

if(pid > 0) {
printf("pid : %d\n", pid);

// 如果大于0,返回的是创建的子进程的进程号, 当前父进程
printf("i am parent process, pid : %d, ppid % d\n", getpid(), getppid());

printf("parent num : %d \n", num);
num += 10;
printf("parent num += 10 : %d \n", num);

} else if(pid == 0) {
// 当前是子进程
printf("i am child process, pid : %d, ppid : %d \n", getpid(), getppid());

printf("child num : %d \n", num);
num += 100;
printf("child num += 100 : %d \n", num);

}

for(int i = 0; i < 3; i++) {
printf("i : %d, pid : %d\n", i, getpid());
sleep(1);
}
return 0;
}

fork 执行流程

image-20220406121610516

image-20220406155328046

image-20220406170044780

修改子进程后就会开辟一个新地址

image-20220406170119438

评论