linux之waitpid函数的简单使用

linux之waitpid函数

waitpid函数:成功:返回清理掉的子进程 ID;失败:-1(无子进程)
原型:pid_t waitpid(pid_t pid, int *wstatus, int options);
a.作用同 wait,但可指定 pid 进程清理,可以不阻塞
b.参数 pid:
> 0(子进程id号) 回收指定 ID 的子进程
-1 回收任意子进程(相当于 wait)

c.如果参数3为WNOHANG,且子进程正在运行,则返回值为0
WNOHANG表示非阻塞,(轮询)
d.参数3为0,则表示阻塞

代码: loop_fork.c

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

int main(int argc,char* argv[])
{
	pid_t p,q;
	pid_t wpid;
	int n=5,i;  //默认创建5个子进程
	if(argc == 2){
		n = atoi(argv[1]);
	}
	
	for(i=0;i<n;i++){//出口1,父进程专用出口
		p = fork();
		if(p==0) break; //出口2,子进程出口,i不自增
		else if(i==3)
			q=p;
	}
	
	if(n==i){
		sleep(n);
		printf("I am parent, pid = %d\n", getpid(), getgid());
		//wait(NULL);//随机回收某个子进程
		//while(wait(NULL));//循环回收子进程
		//waitpid(q,NULL,0);//回收第4个子进程,第3个参数 0 代表阻塞,等价于wait(NULL)
		//while(waitpid(-1,NULL,0));//等价于while(wait(NULL));
		do{
			wpid = waitpid(-1,NULL,WNOHANG);
			if(wpid>0) n--;
			sleep(1);
		}
		while(n>0);
		printf("finish\n");
		//while(1);
	}
	else{
		sleep(i);
		printf("I'm %dth child, pid = %d, gpid=%d\n", 
				i+1, getpid(), getgid());
	}
	
	return 0;
}

结果:
在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
waitpid函数用于等待指定的子进程结束,并回收它的资源。其函数原型如下: ```c #include <sys/types.h> #include <sys/wait.h> pid_t waitpid(pid_t pid, int *status, int options); ``` 其中,pid参数表示要等待的子进程的进程ID。如果pid为-1,表示等待任何一个子进程结束;如果pid大于0,表示等待进程ID为pid的子进程结束;如果pid为0,表示等待当前进程组内的任何一个子进程结束;如果pid小于-1,表示等待进程组ID为pid绝对值的任何子进程结束。 status参数是一个指向int类型的指针,用于存储子进程的终止状态信息。如果不关心子进程的终止状态,可以将该参数设置为NULL。 options参数指定waitpid的行为。可以通过以下宏来指定: - WNOHANG:表示如果没有子进程退出,则立即返回,而不是阻塞等待。 - WUNTRACED:表示如果子进程进入暂停状态,则立即返回。 - WCONTINUED:表示如果子进程恢复运行,则立即返回。 waitpid函数的返回值为子进程的进程ID,如果出错则返回-1。 下面是一个使用waitpid函数的示例程序: ```c #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> #include <sys/wait.h> int main() { pid_t pid; int status; pid = fork(); if (pid == 0) { printf("I am child process, pid=%d\n", getpid()); sleep(5); exit(0); } else if (pid > 0) { printf("I am parent process, pid=%d\n", getpid()); waitpid(pid, &status, 0); if (WIFEXITED(status)) { printf("child process exit normally with status=%d\n", WEXITSTATUS(status)); } else if (WIFSIGNALED(status)) { printf("child process exit by signal=%d\n", WTERMSIG(status)); } } else { perror("fork error"); exit(1); } return 0; } ``` 该程序创建一个子进程,并等待子进程结束。在子进程中,先输出一行信息,然后暂停5秒钟后退出;在父进程中,等待子进程结束后输出子进程的终止状态信息。注意,子进程的退出状态需要通过WIFEXITED和WEXITSTATUS宏来获取,如果子进程是被信号杀死的,则需要通过WIFSIGNALED和WTERMSIG宏来获取信号编号。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值