Linux进程(中)
目录
进程等待
为什么有进程等待
什么是进程等待
怎么做到进程等待
wait
waitpid
进程等待
为什么有进程等待
僵尸进程无法杀死,需要进程等待来消灭他,进而解决内存泄漏问题--必须解决的
我们要通过进程等待,获得子进程退出情况--知道我们给子进程的任务,他完成的怎么样--不必要
什么是进程等待
通过调用wait/waitpid,来进行堆子进程进行状态检测与回收功能!
怎么做到进程等待
代码:
原理:
我们发现,子进程在运行结束后成为僵尸进程,状态Z。
父进程通过调用wait/waitpid,来进行僵尸进程的回收问题。
wait
运行结果
我们发现5s后子进程变为僵尸进程,当再过5s父进程结束wait等待回收子进程pid,子进程成功释放。
因此,进程等待是必须的(回收僵尸进程,避免内存泄漏)
wait是等待任意子进程
父进程执行for循环,子进程内部创建
回收操作
子进程运行结束变为僵尸进程之后成功回收
如果子进程一直不死,那么父进程也不死,默认wait时,调用这个系统调用时不返回,默认叫做阻塞状态。(类似于scanf等待输入操作)
waitpid
wait的功能waitpid子集
pid_ t waitpid(pid_t pid, int *status, int options);
返回值:
当正常返回的时候waitpid返回收集到的子进程的进程ID;
如果设置了选项WNOHANG,而调用中waitpid发现没有已退出的子进程可收集,则返回0;
如果调用中出错,则返回-1,这时errno会被设置成相应的值以指示错误所在;
参数:
pid:
Pid=-1,等待任一个子进程。与wait等效。
Pid>0.等待其进程ID与pid相等的子进程。
status:
WIFEXITED(status): 若为正常终止子进程返回的状态,则为真。(查看进程是否是正常退出)
WEXITSTATUS(status): 若WIFEXITED非零,提取子进程退出码。(查看进程的退出码)
options:
WNOHANG: 若pid指定的子进程没有结束,则waitpid()函数返回0,不予以等待。若正常结束,则返回该子进程的ID。(见下文第三个参数)
第一个参数:等谁
第二个参数:获取进程退出结果(输出型参数)
操作系统会把id进程推出信息拷贝到status。上文exit(1)
但是status结果是256
子进程退出场景有三种,父进程期望获得子进程什么信息?
1.子女进程代码是否异常
2.没有异常,结果对吗?exitcode,不对为什么?通过退出码表示
statu返回256原因:
status36位,前8位表示进程是否出异常,收到什么样的信号,第8位cure dump
信号表,从1开始,若1-7位是不是0,说明 代码是否跑完
8-16表示退出状态,及退出码。1+0000 0000==256。通过statu反应代码是否异常。
父进程想获取子进程信息为什么需要系统调用,直接传全局变量不好吗??(进程独立性)。
位操作查看(区分256和1)
代码
结果
想让waitpid错误返回示例(父进程等待的子进程不是自己的)
第三个参数 (设置等待方式)
--0:阻塞:子进程退出不满足条件,父进程等待(阻塞,不被调用)
非阻塞轮询。(父进程等待过程中可以做别的事,不会一直扽等子进程)
演示: