在开始之前我们先再重新理解一下进程间的独立性。
进程 = 内核数据结构(task_struct + mm_struct + 页表) + 代码和数据
。
进程创建:
我们已经使用过fork()
函数,fork函数就是用来创建子进程
在来说一下fork函数的返回值。
子进程返回的是0,父进程返回的是子进程的pid。
为什么要这么返回呢?
为的就是让父进程管理好子进程。
进程终止:
终止是在干什么?
我们已经说过,进程是内核数据结构 + 代码和数据。
那么终止就是释放这个内核数据结构 + 代码和数据。
但是我们也说过,进程有僵尸状态,当父进程还在忙活,子进程已经结束,此时子进程会先将代码和数据释放掉,但是task_struct
还不能释放,
因为这里存放着进程的退出信息
,所以父进程回收时才可以释放掉。
终止的3种情况。
- 代码跑完,结果不对(
!0
)。 - 代码跑完,结果正确(
0
)。
以上两种情况都是可以通过退出码知道的。
那么退出码是什么呢?
我们在bash命令行中可以使用echo $?
进行查看最近一次子进程的退出码。
所以:我们平时都是return 0,就默认意味着我们写的程序都是正确的。但是真的如此吗哈哈。
那么退出码所对应的含义是什么呢?
我们来打印看看。
但是我们也不必太在意退出码。因为退出码也是可以自定义的。
结果:
那么第三种?
- 进程异常退出。
就像修改野指针的指向,OS一看,那可不行,直接给你一个信号,让你退出。
本质就是发送一个信号给进程让进程结束。
结论:
一个进程终止了,先看是否异常退出,再看退出码!
如何终止?
持续更新…