进程共享
父子进程在fork后有哪些相同
相同:全局变量
不同:1. 进程id,2. fork返回值,3. 父进程id
,4. 运行时间,5. 定时器,6. 未决信号集
父子进程间遵循读时共享,写时复制的原则
exec函数
unistd.h
execl(程序名,所需传递的参数,NULL)l为列表,需要将参数全部列出来
execv(程序名,所需传递的参数数组首地址,包括NULL)v为数组,需要将参数存到指针数组中,在将首地址传给函数
execlp(),execle()
execvp(),execvpe()
回收子进程
1.孤儿进程:父进程先于子进程结束,则子进程成为孤儿进程,子进程的父进程成为init进程。称为init进程领养孤儿进程。
ps ajx 查看父子进程关系。
kill -9 pid号 杀死孤儿进程
2.僵尸进程:进程终止,父进程尚未回收,子进程残留资源存放于内核中,变成僵尸进程。
特别注意,僵尸进程是不能用kill命令清除
如果要结束僵尸进程,可以使用wait函数
wait函数
一个进程在终止时会关闭所有文件描述符,释放在用户空间分配的内存,但他的PCB还保留着内核在其中保存了一些信息
如果是正常终止,则保存着退出状态。如果是异常终止,则保存着导致该进程终止的信号是哪个。
当一个进程终止了,我们需要知道进程退出时的状态,我们需要通过进程结束时的退出码来识别。
exit()会立刻终止调用进程
echo $? 显示上次的退出码