当前位置: 技术问答>linux和unix
linux 调用进程
来源: 互联网 发布时间:2016-04-30
本文导语: 大家好! 请教一个问题:有两个进程(A&B),进程A中通过excel()函数调用进程B。请问进程A如何获取进程B的返回结果? 谢谢! | There is no return from a successful call to an exec() function, becaus...
大家好!
请教一个问题:有两个进程(A&B),进程A中通过excel()函数调用进程B。请问进程A如何获取进程B的返回结果?
谢谢!
请教一个问题:有两个进程(A&B),进程A中通过excel()函数调用进程B。请问进程A如何获取进程B的返回结果?
谢谢!
|
There is no return from a successful call to an exec() function, because the calling process is functionally replaced by the new process. You can never return to the to original code unless the call to execl fails.
calling process (A) 都被 B 取代了,B 的结果不可能返回给 A
lz 应该考虑 A 经过 fork 生成 C,C 再执行 execl,生成 B
A 可以得到 B 的返回
calling process (A) 都被 B 取代了,B 的结果不可能返回给 A
lz 应该考虑 A 经过 fork 生成 C,C 再执行 execl,生成 B
A 可以得到 B 的返回
wait(&status);
if (WIFEXITED(status)) {
printf("exited, status=%dn", WEXITSTATUS(status));
}
|
exec系列调用完毕后,原来的进程的地址空间就被exec的参数所代表的进程的地址空间取代了,本质上它们还是一个进程,比如进程号pid就没有变,task_struct的大部分字段都没有变,只是mm_struct和file相关的还有io权限等相关的变化了,可以说exec后原来进程的地址空间mm_struct的引用计数被减1,如果原来的进程就一个线程,那么该地址空间就被释放了,即便多线程情况下的mm_struct不被释放,那它也不属于你这个线程乐,所以你根本无法在执行完exec后再回到原来的进程(参考内核源码sys_execve吧)。
倘若想得到exec的结果,办法是:
1.fork()-->在子进程exec
2.直接用system函数,它本质上就是先fork再exec,只是封装了一下下
倘若想得到exec的结果,办法是:
1.fork()-->在子进程exec
2.直接用system函数,它本质上就是先fork再exec,只是封装了一下下
|
希望以下两点说明能解决你的问题。
1、waitpid函数的原型
#include
pid_t waitpid(pid_t pid, int * statloc, int option);
先不考虑最后一个参数,第一个参数是需要等待的进程id,第二个参数是需要等待进程的返回状态,即如果通过waitpid获取到第一个参数定义的进程的返回状态,那么该返回状态存入statloc。需要注意的是,返回状态包括很多信息,其中之一就是返回值。
2、检查wait和waitpid返回状态的宏
WIFEXITED(statloc) 这个判断是不是正常返回,若正常返回其值为真
WEXITSTATUS(statloc) 如果正常返回,取statloc返回状态中的返回值。
1、waitpid函数的原型
#include
pid_t waitpid(pid_t pid, int * statloc, int option);
先不考虑最后一个参数,第一个参数是需要等待的进程id,第二个参数是需要等待进程的返回状态,即如果通过waitpid获取到第一个参数定义的进程的返回状态,那么该返回状态存入statloc。需要注意的是,返回状态包括很多信息,其中之一就是返回值。
2、检查wait和waitpid返回状态的宏
WIFEXITED(statloc) 这个判断是不是正常返回,若正常返回其值为真
WEXITSTATUS(statloc) 如果正常返回,取statloc返回状态中的返回值。
|
先fork子进程exec,父进程waitpid