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

【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

#include

#include

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()函數返回就是正常,呵呵。

這下大家明白怎么判斷了吧?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值