linux在主函数中调用进程,linux 调用进程

大家好!

请教一个问题:有两个进程(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 的返回

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,只是封装了一下下

|

希望以下两点说明能解决你的问题。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值