Linux开发

推荐列表 站点导航

当前位置:首页 > 服务器技术 > Linux开发 >

Linux的wait函数

来源:互联网  作者:网友投稿  发布时间:2021-01-05 07:44
一个进程在终止时会关闭所有文件描述符,释放在用户空间分配的内存,但它的PCB还保留着,内核在其中保存了一些...

一个进程在终止时会关闭所有文件描述符,释放在用户空间分配的内存,但它的PCB还保留着,内核在其中保存了一些信息:如果是正常终止则保存着退出状态,如果是异常终止则保存着导致该进程终止的信号是哪个。这个进程的父进程可以调用wait或waitpid获取这些信息,然后彻底清除掉这个进程。我们知道一个进程的退出状态可以在Shell中用特殊变量$?查看,因为Shell是它的父进程,当它终止时Shell调用wait或waitpid得到它的退出状态同时彻底清除掉这个进程。

 

父进程调用wait函数可以回收子进程终止信息。该函数有三个功能:

① 阻塞等待子进程退出

② 回收子进程残留资源

③ 获取子进程结束状态(退出原因)。

 

pid_t wait(int *status); 成功:清理掉的子进程ID;失败:-1 (没有子进程)

当进程终止时,操作系统的隐式回收机制会:1.关闭所有文件描述符 2. 释放用户空间分配的内存。内核的PCB仍存在。其中保存该进程的退出状态。(正常终止→退出值;异常终止→终止信号)

 

可使用wait函数传出参数status来保存进程的退出状态。借助宏函数来进一步判断进程终止的具体原因。宏函数可分为如下三组:

1.WIFEXITED(status) 为非0 → 进程正常结束

WEXITSTATUS(status) 如上宏为真,使用此宏 → 获取进程退出状态 (exit的参数)

2.WIFSIGNALED(status) 为非0 → 进程异常终止

WTERMSIG(status) 如上宏为真,使用此宏 → 取得使进程终止的那个信号的编号。

*3.WIFSTOPPED(status) 为非0 → 进程处于暂停状态

WSTOPSIG(status) 如上宏为真,使用此宏 → 取得使进程暂停的那个信号的编号。

WIFCONTINUED(status) 为真 → 进程暂停后已经继续运行

 

#include <unistd.h>  

#include <stdlib.h>  

#include <stdio.h>  

#include <sys/wait.h>  

int main(void)  

{  

pid_t pid, wpid;  

int status;  

pid = fork();  

if(pid == -1){  

perror("fork error");  

exit(1);  

} else if(pid == 0){        //son  

printf("I'm process child, pid = %d\n", getpid());  

#if 1  

execl("./abnor", "abnor", NULL);  

perror("execl error");  

exit(1);  

#endif  

sleep(1);                 

exit(10);  

} else {  

//wpid = wait(NULL);    //传出参数  

wpid = wait(&status);   //传出参数  

if(WIFEXITED(status)){  //正常退出  

printf("I'm parent, The child process "  

"%d exit normally\n", wpid);  

printf("return value:%d\n", WEXITSTATUS(status));  

} else if (WIFSIGNALED(status)) {   //异常退出  

printf("The child process exit abnormally, "  

"killed by signal %d\n", WTERMSIG(status));  //获取信号编号  

} else {  

printf("other...\n");  

相关热词:

本站内容来源于网络,如有侵权请与我们联系,我们会及时删除,我们深感抱歉!
注:本站所有信息仅供用于网络技术学习参考,学习中请遵循相关法律法规!

本文地址: https://v30.fanwenzhu.com/server/kaifa/11089.shtml

相关文章
Copyright © www.juheyunku.com      关于 | 合作 | 声明 | 联系 | 更新 | 地图 | Tags

Linux的wait函数

2021-01-05 编辑:网友投稿

一个进程在终止时会关闭所有文件描述符,释放在用户空间分配的内存,但它的PCB还保留着,内核在其中保存了一些信息:如果是正常终止则保存着退出状态,如果是异常终止则保存着导致该进程终止的信号是哪个。这个进程的父进程可以调用wait或waitpid获取这些信息,然后彻底清除掉这个进程。我们知道一个进程的退出状态可以在Shell中用特殊变量$?查看,因为Shell是它的父进程,当它终止时Shell调用wait或waitpid得到它的退出状态同时彻底清除掉这个进程。

 

父进程调用wait函数可以回收子进程终止信息。该函数有三个功能:

① 阻塞等待子进程退出

② 回收子进程残留资源

③ 获取子进程结束状态(退出原因)。

 

pid_t wait(int *status); 成功:清理掉的子进程ID;失败:-1 (没有子进程)

当进程终止时,操作系统的隐式回收机制会:1.关闭所有文件描述符 2. 释放用户空间分配的内存。内核的PCB仍存在。其中保存该进程的退出状态。(正常终止→退出值;异常终止→终止信号)

 

可使用wait函数传出参数status来保存进程的退出状态。借助宏函数来进一步判断进程终止的具体原因。宏函数可分为如下三组:

1.WIFEXITED(status) 为非0 → 进程正常结束

WEXITSTATUS(status) 如上宏为真,使用此宏 → 获取进程退出状态 (exit的参数)

2.WIFSIGNALED(status) 为非0 → 进程异常终止

WTERMSIG(status) 如上宏为真,使用此宏 → 取得使进程终止的那个信号的编号。

*3.WIFSTOPPED(status) 为非0 → 进程处于暂停状态

WSTOPSIG(status) 如上宏为真,使用此宏 → 取得使进程暂停的那个信号的编号。

WIFCONTINUED(status) 为真 → 进程暂停后已经继续运行

 

#include <unistd.h>  

#include <stdlib.h>  

#include <stdio.h>  

#include <sys/wait.h>  

int main(void)  

{  

pid_t pid, wpid;  

int status;  

pid = fork();  

if(pid == -1){  

perror("fork error");  

exit(1);  

} else if(pid == 0){        //son  

printf("I'm process child, pid = %d\n", getpid());  

#if 1  

execl("./abnor", "abnor", NULL);  

perror("execl error");  

exit(1);  

#endif  

sleep(1);                 

exit(10);  

} else {  

//wpid = wait(NULL);    //传出参数  

wpid = wait(&status);   //传出参数  

if(WIFEXITED(status)){  //正常退出  

printf("I'm parent, The child process "  

"%d exit normally\n", wpid);  

printf("return value:%d\n", WEXITSTATUS(status));  

} else if (WIFSIGNALED(status)) {   //异常退出  

printf("The child process exit abnormally, "  

"killed by signal %d\n", WTERMSIG(status));  //获取信号编号  

} else {  

printf("other...\n");  

本站内容来源于网络,如有侵权请与我们联系,我们会及时删除,我们深感抱歉!
注:本站所有信息仅供学习参考!
本文地址为 https://v30.fanwenzhu.com/server/kaifa/11089.shtml

相关文章

风云图片

推荐阅读

返回Linux开发频道首页