1.exec函数族
调用exec后用户空间代码和数据替换成新的程序,从新的程序历程开始执行,但是并不创建新的进程,进程PID不变,换核不换壳
execlp、execl
只有调用失败才会返回-1,调用成功就结束了不会返回
2.回收子进程
孤儿进程:父进程先于子进程结束,子进程的父进程变为init进程,init进程领养孤儿进程
僵尸进程:进程终止,父进程尚未回收,子进程残留资源(PCB)放于内核中,变成僵尸进程
僵尸进程不可以用KILL杀死,因为KILL命令是用来终止进程的,而僵尸进程已经结束了
wait 函数:一次wait/waitpid只能清理一个子进程,清理多个要使用循环
1)阻塞等待子进程
2)回收子进程残留资源
3)获取子进程结束状态(残留原因)
waitpid函数
可以指定PID进程进行清理,可以不阻塞
WNOHANG 变成非阻塞,为了确保杀死子进程,可以采用轮询
返回0:参数三为WNOHANG ,且子进程在运行
3.进程间通信IPC
1)管道PIPE:内核使用环形队列
管道自己读不能写;
数据一旦被读走,就不再管道内不可以重复读取
由于管道采用半双工通信方式,因此数据只能在一个方向上流动
只能在有共公祖先的进程之间通信
2)FIFO(命名管道)
通过FIFO不相关进程也可以交换数据
3)MMP(共享内存)
mmap函数
成功返回创建映射的首地址,失败返回MAP_FAILED宏
MAP_SHARED时创建映射区的权限要小于等于文件的权限,MAP_PRIVATE只要能建立映射区,就无所谓了
创建映射区的过程隐含对文件进行一次读操作
offset必须是4K整数倍(偏移位置),内核里的MMU建立的,它一页为4K
文件描述符先关闭,对MMAP没有影响
MAP_SHARED父子进程共享映射区
MAP_PRIVATE父子进程独占映射区
父子进程共享:1.打开的文件 2.MAP_SHARED共享的映射区
匿名映射:文件好像没有用,不需要创建文件
MAP_ANONYMOUS|MAP_SHARED,fd的位置写-1,大小还是需要按需求填写
MMAP无血缘关系进程通信
对同一个文件做两次映射,通过映射区通信
//也可以对同一个文件进行通信