1 进程创建
1.fork函数
fork从已存在的进程中创建一个新进程,新进程为子进程,原进程为父进程。
fork返回值:
在fork返回时,新进程已经创建完毕,子进程返回0,父进程返回子进程的pid
在执行fork时,内核做了以下几件事:
1.分配新的内存块和pcb给子进程
2.复制父进程的部分pcb内容给子进程
3.将子进程添加到系统进程列表中
4.fork返回,开始调度器调度
fork后,父子进程代码共享,数据写时拷贝
fork失败的原因:
1.系统中有太多进程
2.用户的进程数超过了限制
2. vfork函数
vfork也是用于创建子进程,但是与fork不同的是:
1.vfork创建的子进程和父进程共享地址空间
2.vfork保证子进程先运行
进程终止
正常终止
1.从main函数返回
2.调用exit或_exit
异常终止
1.信号终止
exit与_exit的区别
_exit:直接退出
exit:
1.执行用户定义的清理函数
2.冲刷缓冲区,关闭所有打开的流
3.调用_exit
进程等待
作用:父进程通过进程等待的方式,回收子进程资源,获取子进程的退出信息
进程等待的方法
1.wait
pid_t wait(int* status);
任意一个子进程退出,wait都会返回,返回值为退出子进程的pid,参数为进程退出的状态,可以设置为NULL
2.waitpid
pid_t waitpid(pid_t pid,int* status,int options);
当参数pid=-1时,waitpid等同于wait,等待任意一个子进程
当参数pid>0时,waitpid等待进程ID为pid的子进程返回
可以通过设置options为WNOHANG将waitpid设置为非阻塞式等待
进程程序替换
大部分情况下,我们创建子进程是为了让它执行其他程序,而不是把父进程的程序多执行一次,可以通过exec函数族来进行程序替换
当进程调用exec函数时,进程的用户空间代码和数据完全被新程序替换,从新程序的入口开始执行,exec程序的进程id仍旧是原子进程的pid