您的位置:首页 > 运维架构 > Linux

Linux 父进程如何获取子进程返回值?parent get child process return value,fork,wait,wait_pid

2014-01-05 22:10 2131 查看
【by lanmanck】

创建子进程一般用fork,因为用execv后就不返回了,父进程无法跟子进程通信。

这里有个例子:
http://blog.csdn.net/wallwind/article/details/6998602
父进程fork后,可以使用wait和wait_pid来等待子进程结束,wait/wait_pid可以阻塞也可以不阻塞,权威解析在这里:
http://linux.die.net/man/3/wait
示例代码修改一下:

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

int main(void)  
{
	int child_ret;
	pid_t pid1,pid2;
	printf("before fork\n");

	if((pid1=fork())<0){
		printf("fork error");

	}else if(pid1==0){
		printf("child process's pid=%d,sleep 3 sec\n",getpid());
		sleep(3);
		exit(-3); //line19

	}else{
		printf("parent process wait child terminate...\n");
		pid2=wait(&child_ret);
		printf("wait process's pid=%d,status=0x%X,exit value=%d(0x%X)\n",pid2,child_ret,
				WEXITSTATUS(child_ret),WEXITSTATUS(child_ret));
	}  

	exit(0);  

}


我们主要关注line19,因为用
pid2=wait(&child_ret);


等待后,主要就是看child_ret的值,这样父进程好做进一步判断;

通过打印得知:

1、如果子进程调用exit(val);退出,则child_ret的高八位就是val,即child_ret = (val<<8) | 0;

使用WEXITSTATUS(child_ret)可以直接得到低八位,即val的值。

2、如果子进程意外中止,例如用了非法指针,改一下,在exit(-3)前加上:

*(int*)0 = 1234;

可以看到返回值val = 0x0B,即低八位非0。这时用WIFEXITED(status)(bool类型的)可以得到0,即异常,而为真表示正常退出;

3、可以组合使用:

if(WIFEXITED(status) != 0){

printf("normally terminate val:%d",status);

}

何为正常退出?一般调用了exit(val)或者从main()函数返回就是正常,呵呵。

这下大家明白怎么判断了吧?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐