文章目录
进程
基本概念
进程:可执行程序 +管理该进程的数据结构集合
进程控制块(PCB):进程属性的集合
进程创建(fork)
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
int ret = fork();
printf("hello proc : %d!, ret: %d\n", getpid(), ret);
sleep(1);
return 0;
}
由于PCB里的程序计数器存储的是即将被执行的下一条指令的地址,故在执行完fork()语句之后,子进程从父进程拷贝过来的代码直接从fork语句的下一条语句执行
相关命令
- 查看进程
- 获取本进程PID,和父进程PID
- 杀死进程指令
僵尸进程
概念:
所谓僵尸进程,是指子进程先于父进程退出,子进程会告知父进程自己退出的消息,但是父进程不予理会,导致该子进程变成了僵尸进程
测试案例与结果:
S+表示睡眠状态
R+表示运行状态
Z+表示僵死状态
僵尸进程危害
占用了操作系统的资源,内存泄露掉了
解决僵尸进程方法
- 重启操作系统(代价太大)
- 杀掉父进程,子进程就会被init进程所领养,init进程回收子进程的资源。(该方法不推荐,因为杀掉父进程会影响到该父进程下的其它子进程的运行)。
- 进程等待。(被推崇的优雅方式)
孤儿进程
概念:
所谓孤儿进程是指父进程先于子进程退出,子进程被init进程所领养,该子进程便变成了孤儿进程。(进程是没有孤儿状态的)
测试案例与结果:
可以看出父进程先于子进程结束后,子进程被一号进程(init进程)所领养,故由一号进程回收喽。
问题引入:
#include <stdio.h>
2 #include <unistd.h>
3 int main()
4 {
5 int i=10;
6 int ret=fork();
7 if(ret<0)
8 {
9 return 0;
10 }
11 else if(ret==0)
12 {
13 printf("child. i=%d,%p\n", i, &i);
14 }
15 else
16 {
17 i += 10;
18 printf("father. i=%d,%p\n", i, &i);
19 }
20 return 0;
21 }
(为什么父进程的 i 和子进程的 i 地址一样,值却不一样呢?)
这就是写时拷贝的原理:
https://blog.csdn.net/qq_44768163/article/details/115054802