进程创建
fork()
创建一个进程的流程:
首先要创建一个pcb,使用fork()函数,fork()函数中会调用clone()函数,来复制父进程中的信息。这里是采用的写实拷贝技术(实现代码共享,数据独有)。子进程会复制父进程的pcb、虚拟地址空间、页表,但是在子进程要修改数据时会给子进程申请新的物理地址来存放修改的数据,这样就实现了数据独有。各个进程之间独立性。
vfork()
创建子进程步骤:
1.调用clone
2.创建pcb
3.复制父进程
子进程和父进程共用同一个虚拟地址空间(共用虚拟地址空间会造成调用栈混乱)。
vfork()是一个阻塞函数,父进程创建子进程后,这个vfork()函数在父进程中并不会立即返回,会阻塞知道子进程exit()退出或者程序替换,才会返回(意味着父进程直到子进程退出或程序替换之后才会运行)。
进程终止
退出一个进程。
异常退出:程序运行过程中异常崩溃,程序没有运行完毕。
正常退出:程序运行完毕。
如何终止一个进程:
return
exit(int status)—库函数
_exit(int status)–系统调用接口,退出时不会刷新缓冲区
进程等待
等待一个子进程的退出,获取退出子进程的返回值,并且释放子进程资源,防止出现僵尸进程。
pid_t wait(int *status);阻塞等待任意一个子进程退出,将返回值放到status中,返回退出子进程的pid。
pid_t waitpid(pid_t pid,int *status,int options);等待指定子进程>0/任意一个子进程-1退出,返回值放到status中,options为0时,则函数默认阻塞,options为WNOHANG时,则设置为非阻塞。返回值:-1表示出错,==0表示没有子进程退出,>0表示退出的子进程pid.
阻塞:为了完成一个功能,发起调用,若当前不具备完成条件,则等待,直到条件具备完成功能后调用返回。
非阻塞:为了完成一个功能,发起调用,若当前不具备完成条件,则立即报错返回。
阻塞和非阻塞的区别:调用是否立即返回。
通常非阻塞需要循环操作。
函数应用代码展示:
#include<stdio.h>
#