0


Linux——进程等待

在这里插入图片描述

**📘北尘_**:个人主页
🌎个人专栏:《Linux操作系统》《经典算法试题 》《C++》 《数据结构与算法》

☀️走在路上,不忘来时的初心

文章目录


一、为什么要进程等待

  1. 解决子进程僵尸问题带来的内存泄漏
  2. 为了获取子进程退出信息

二、进程等待的方法

1、wait方法

wait介绍
在这里插入图片描述

#include<sys/types.h>#include<sys/wait.h>pid_twait(int*status);//返回值://成功返回被等待进程pid,失败返回-1。//参数://输出型参数,获取子进程退出状态,不关心则可以设置成为NULL

2、waitpid方法

waitpid介绍
在这里插入图片描述

返回值:
当正常返回的时候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。

如果子进程已经退出,调用wait/waitpid时,wait/waitpid会立即返回,并且释放资源,获得子进程退
出信息。
如果在任意时刻调用wait/waitpid,子进程存在且正常运行,则进程可能阻塞。
如果不存在该子进程,则立即出错返回。

在这里插入图片描述


三、获取子进程status

wait和waitpid,都有一个status参数,该参数是一个输出型参数,由操作系统填充。
如果传递NULL,表示不关心子进程的退出状态信息。否则,操作系统会根据该参数,将子进程的退出信息反馈给父进程。
status不能简单的当作整形来看待,可以当作位图来看待,具体细节如下图(只研究status低16比特
位):
在这里插入图片描述

测试代码:
#include<sys/wait.h>#include<stdio.h>#include<stdlib.h>#include<string.h>#include<errno.h>intmain(){pid_t pid;if((pid=fork())==-1)perror("fork"),exit(1);if( pid ==0){sleep(20);exit(10);}else{int st;int ret =wait(&st);if( ret >0&&( st &0X7F)==0){// 正常退出printf("child exit code:%d\n",(st>>8)&0XFF);}elseif( ret >0){// 异常退出printf("sig code : %d\n", st&0X7F);}}}

具体代码实现

进程的阻塞等待方式:

intmain(){pid_t pid;
 pid =fork();if(pid <0){printf("%s fork error\n",__FUNCTION__);return1;}elseif( pid ==0){//childprintf("child is run, pid is : %d\n",getpid());sleep(5);exit(257);}else{int status =0;pid_t ret =waitpid(-1,&status,0);//阻塞式等待,等待5Sprintf("this is test for wait\n");if(WIFEXITED(status)&& ret == pid ){printf("wait child 5s success, child return code is :%d.\n",WEXITSTATUS(status));}else{printf("wait child failed, return.\n");return1;}}return0;}

进程的非阻塞等待方式:

#include<stdio.h>#include<unistd.h>#include<stdlib.h>#include<sys/wait.h>intmain(){pid_t pid;
 
 pid =fork();if(pid <0){printf("%s fork error\n",__FUNCTION__);return1;}elseif( pid ==0){//childprintf("child is run, pid is : %d\n",getpid());sleep(5);exit(1);}else{int status =0;pid_t ret =0;do{
 ret =waitpid(-1,&status, WNOHANG);//非阻塞式等待if( ret ==0){printf("child is running\n");}sleep(1);}while(ret ==0);if(WIFEXITED(status)&& ret == pid ){printf("wait child 5s success, child return code is :%d.\n",WEXITSTATUS(status));}else{printf("wait child failed, return.\n");return1;}}return0;}

标签: linux java 服务器

本文转载自: https://blog.csdn.net/2301_78995005/article/details/135721258
版权归原作者 北尘_ 所有, 如有侵权,请联系我们删除。

“Linux——进程等待”的评论:

还没有评论