zombie不占用内存也不占用CPU,表面上我们可以不用在乎它们的存在,然而事实上UNIX系统限制了某一时刻能同时存在的进程的最大数目。如果程序不及时清理系统中的zombie,最终会导致进程数过多,当再次需要产生新进程时就会出错。 鉴于上边的原因,我们需要在子进程调用exit后在父进成中调用wait或waipid #include<sys/types.h> #include<sys/wait.h> pid_t wait(int &statloc); pid_t waitpid(pid_t pid,int *statloc, int options); Both return:process ID if OK,-1 on error 它们被父进程调用以获取子进程结束信息、清除zombie。当父进成调用这两个函数时 a 阻塞(如果它的子进程还在运行) b 立即返回子进程结束信息(如果一个子进程已经结束并等待父进程获取信息) c 返回错误(如果不存在子进程) 两个函数的不同在于wait会令调用者阻塞直至某个子进程终止而waitpid则可以通过设置一个选项来设置为非阻塞,另外waitpid并不是等待第一个结束的进程而是等待参数中pid指定的进程。 两个函数中的变量statloc是一个指向int型数据的指针。如果此变量不是NULL,则结束的进程的termination status会被保存在statiloc所指向的内存的区域;如果我们不关心termination status,则可以把statloc置为NULL。 传统的实现中这两个函数返回的整数中特定的比特位被赋予了特定的含义。POSIX.1指定了一些包含在头文件<sys/wait.h> 宏来查看这些termination status Macro Description WIFEXITED(status) 如果status是由一个正常结束的进程产生的则值为真, 此时我们可以继续使用宏WEXITSTATUS(status)来 获取exit或_exit的参数 WIFSIGNALED(status) 如果status是由一个异常结束(接受到一个信号)的进 程产生的则值为真, |
linux中wait与waitpid的差别
最新推荐文章于 2023-11-12 18:54:21 发布