C++语法 进程相关函数
C++ 函数waitpid
waitpid的使用
waitpid用于等待特定的进程结束之后,主进程再继续执行,这时主进程会进入阻塞状态。在fork之后,如果子进程不使用waitpid,则可能时主进程先结束,也可能时子进程先结束。
(阻塞和非阻塞
阻塞: 简单来讲就是一直等待. 阻塞式等待, 为了完成某个功能, 选择一直等待
非阻塞: 简单来讲就是立即返回, 非阻塞式等待, 若果某个功能未完成, 选择立即返回)
waitpid的使用
waitpid用于等待特定的进程结束之后,主进程再继续执行,这时主进程会进入阻塞状态。在fork之后,如果子进程不使用waitpid,则可能时主进程先结束,也可能时子进程先结束
什么是进程等待
简单来说, 进程等待是进程的一种状态, 是父进程等待子进程退出时的一个过程
为什么要进程等待
简单来讲, 因为要避免产生僵尸进程.
进程在退出的时候, 会关闭所有的文件描述符, 释放在用户空间中分配的内存, 但是 PCB 仍会暂时保留, 里面还存放着进程的退出状态以及统计信息等.
当一个进程创建一个子进程时, 父进程往往需要读取子进程的运行结果, 如果子进程先于父进程退出, 父进程则无法获取子进程的退出状态, 子进程的一些残留信息将一直存在(也就是变成所谓的僵尸态), 久而久之, 便会造成内存泄漏.
如何通过进程等待解决上述问题
通过两个系统调用接口来实现进程等待:
pid_t waitpid(pid_t pid, int *status, int options);
// pid:
// pid = -1: 等待任意一个子进程
// pid > 0: 等待子进程 ID 为 pid 的子进程
// status: 进程状态, 若不关注可以置为 NULL
//options: 选项
//阻塞式等待: options 为 0
//非阻塞式等待: options 为 WNOHANG
因为当一个进程正常或者异常终止时, 内核会向父进程发送一个 SIGCHLD 信号. 父进程可以选择忽略该信号, 或者提供一个该信号发生时调用处理的函数. 对于这种信号, 系统默认是忽略它的, 所以父进程如果想要处理掉子进程就要主动调用系统提供的处理接口 — wait 和 waitpid
阻塞和非阻塞
阻塞: 简单来讲就是一直等待. 阻塞式等待, 为了完成某个功能, 选择一直等待
非阻塞: 简单来讲就是立即返