进程的状态
- 父进程通过fork()创建子进程(子进程进入就绪态,等待内核调用至CPU运行)
- 子进程进入CPU,状态改为执行态
- 若运行时间耗尽,或者被高优先级抢占,则返回为就绪态等待
- 若资源不足,则进入睡眠挂起态等待资源。睡眠挂机分为:浅度睡眠:可被中断,可以接受信号马上响应。深度睡眠:不可被中断,接受信号仍然响应不了。(一般出现在等待资源为硬件资源,如按键唤醒)
- 睡眠挂起状态获得资源马上进入就绪态等待。
- 若执行态收到暂停信号:SIGSTOP/SIGTSTP,则进入暂停态。直到收到恢复信号(SIGCONT)才返回就绪态等待。
- 若执行态中程序正常退出,或者遇到最后线程,或者被信号杀死,则进入僵尸态等待被处理。
- 父进程会通过调用wait/waitpid函数将僵尸态进程进行回收资源,获得子进程退出状态,同步父子进程等操作,使僵尸态进程变为死亡态。
进程的创建与退出
进程创建fork()
head | 功能 |
---|---|
函数接口 | pid_t fork(void) |
所需头文件 | #include<unistd.h> |
返回值 | -1:执行失败 |
返回值 | 0:执行成功,且返回到子进程 |
返回值 | 1:执行成功,且返回到父进程中。返回值为其子进程的PID |
注意 | 该函数成功执行时,将会使得原来的进程一分为二,分别称之为父进程和子进程,fork会分别返回到父子进程当中,然后它们并发独立运行 |
代码示例:
代码运行结果
通过上述程序不仅介绍了如何使用fork()创建子进程
同时也说明了子进程的修改与父进程互不相关,两者是并发独立运行的。
进程的退出exit/_exit
通过上图可以了解两者的不同功能
首先介绍一下什么是退出处理函数:
通过运行结果可以知道,只有当程序正常退出的时候,才会去调用的退出处理函数,那么这个退出处理函数的方式是以栈的方式去注册的。
如果使用_exit()退出:则不会对这些函数进行处理。