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
示例代码修改一下:
我们主要关注line19,因为用
等待后,主要就是看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()函数返回就是正常,呵呵。
这下大家明白怎么判断了吧?
创建子进程一般用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()函数返回就是正常,呵呵。
这下大家明白怎么判断了吧?
相关文章推荐
- nodejs的process模块如何获取其他进程的pid
- 如何获取linux下的进程pid列表
- How to get the password text in a text with password property from another process using C++ - 用C++如何从不同进程获取密码框文本
- Linux系统开发 4 进程资源 环境 fork()子进程 wait() waitpid()僵尸 孤儿进程
- !!!!Linux系统开发 系列 4 进程资源 环境 fork()子进程 wait() waitpid()僵尸 孤儿进程
- Linux有问必答:如何在脚本中获取进程ID(PID)
- java中如何获取Runtime.getRuntime().exec()或ProcessBuilder.start()产生的进程信息
- linux 下根据进程名字获取进程的进程号PID,类似pidof,C函数
- 获取进程内存信息 GetProcessMemoryInfo (p/invoke)
- Linux获取进程pid
- Linux进程控制编程之fork、wait
- Linux学习之进程fork()、exec、exit()/_exit()、wait()/waitpid
- Process 后, 如何获取打开窗口的句柄(根据进程句柄获取窗口句柄)
- 【Linux】如何创建daemon进程&fork一次和fork两次有什么区别
- Linux进程相关,fork,wait,waitpid,WIFEXITED
- uc笔记07---进程管理,PID,#ps,getxxxid,fork,vfork,system
- .linux进程知识 程序存储、crontab、fork与vfork、exec、_exit()、wait()与waitpid()、孤儿和僵尸 文件读写 文件锁、select、poll
- linux进程和子进程获取进程号
- Linux下如何在进程中获取虚拟地址对应的物理地址
- Linux 下用vfork()创建进程,子进程用return和exit返回的区别