本文主要是介绍linux多进程基础(3):waitpid()函数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
前文已经讲解了wait函数,这一篇要讲的是
waitpid()函数.
waitpid()函数与wait()函数目的一致:回收子进程资源,但它比 wait()
更灵活,其可以指定要等待的子进程的 PID(进程ID),并且可以设置函数是阻塞还是非阻塞的,当设置为非阻塞的,主函数将不再等待子函数执行.
1.waitpid()函数定义
pid_t waitpid(pid_t pid, int *status, int options);
其中
:
pid
:
若pid>0:回收某个子进程的PID;
若pid=0:回收当前进程组的所有子进程;
若pid=-1:回收所有的子进程,相当与wait()函数;
若pid<-1:回收指定进程组中的子进程.
status
:
一个指针,用于存储子进程的退出状态。
options
:
设置阻塞或者非阻塞。0为阻塞,WNOHANG
选项为非阻塞。
返回值:
>0:返回子进程的ID;
=0:表示还有子进程;
=-1:错误或者已无子进程.
2.举例
为了更好的帮助大家理解wait()h和waitpid()函数的区别,我先写一个简单的wait函数的代码,主要演示使用wait函数,主函数会阻塞,直到子函数运行完后才能接着运行,代码如下:
#include <sys/types.h>
#include <unistd.h>
#include<iostream>
#include <sys/wait.h>int main(void){pid_t pid=fork();if(pid>0){wait(&pid);std::cout<<"我是父进程,我等你子进程"<<std::endl;}else if(pid==0){int i=0;while(i<3){std::cout<<"我是子进程,我的ID是:"<<getpid()<<",我的父进程ID是:"<<getppid()<<std::endl;i++;sleep(1);}}
}
运行程序得到:
可以看到, 主函数阻塞,直到子函数运行完后才能接着运行.
接下来我们将wait替换成waitpid,代码如下:
#include <sys/types.h>
#include <unistd.h>
#include<iostream>
#include <sys/wait.h>
int main(void){pid_t pid=fork();if(pid>0){waitpid(-1,&pid,WNOHANG);std::cout<<"我是父进程,我等你子进程"<<std::endl;}else if(pid==0){int i=0;while(i<3){std::cout<<"我是子进程,我的ID是:"<<getpid()<<",我的父进程ID是:"<<getppid()<<std::endl;i++;sleep(1);}}
}
运行程序得到结果:
可以发现,主进程并没有因为等待子进程而发生阻塞.
这篇关于linux多进程基础(3):waitpid()函数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!