【求助】Linux C如何获取execvp返回值

summer小橙子 2014-02-13 10:13:14
各位,我想要获取一个子进程中由execvp启动的程序的返回值,实现代码如下:
传给这个函数的参数是:
filename=sh,argv[]={"sh", "-c", "hello &"};

按理来讲,如果execvp正常运行的话,子进程执行完sh -c hello &后会返回这个命令的执行结果给主进程
可是现在由于sh -c hello &在后台运行,如果程序hello不存在,用宏WIEXITSTATUS应该会得到误值,可是总0;而执行sh -c hello就能得到,仅仅是有无&的区别,为什么,怎么样才能获得前种情况的返回值?


int execute(const char *filename, const char *argv[])
{
pid_t pid = -1;

if (0 == (pid = fork())) {
execvp(filename, (char * const *) argv);
getsystime(strtime);
exit(127);
} else if (0 < pid) {
int status = -1;
wait(&status);
return status;
} else {
getsystime(strtime);
return pid;
}

return 0;
}
...全文
507 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
summer小橙子 2014-02-13
  • 打赏
  • 举报
回复
引用 1 楼 Idle_Cloud 的回复:
带了&后,返回是会一直成功的,你可以改下你的设计啊,fork出一个进程来,然后执行程序的时候不要&就好了。
因为我想要确定hello是否被sh执行,所以需要在主进程中wait; 另一方面,不想hello的执行一直阻塞主进程,所以采用了& 我的目标是:让hello在不阻塞主进程的情况下,还能告诉主进程他是否已经执行 谢谢~
Linux-Torvalds 2014-02-13
  • 打赏
  • 举报
回复
恐怕比较困难,要获取返回值,就不能放到后台运行。 在bash当中,使用如下的方式获取后台进程的返回值的。
background_cmd &
my_pid=$!
# ...
# ...
wait $my_pid
status=$?
完全没有办法和C code整合起来。
Carl_CCC 2014-02-13
  • 打赏
  • 举报
回复
带了&后,返回是会一直成功的,你可以改下你的设计啊,fork出一个进程来,然后执行程序的时候不要&就好了。
Carl_CCC 2014-02-13
  • 打赏
  • 举报
回复
引用 7 楼 zhugesummer 的回复:
[quote=引用 5 楼 Idle_Cloud 的回复:] fork出来了一个子进程,堵塞的是子进程,没有堵塞主进程啊。
我的主进程在wait[/quote] 那就fork一个子进程
summer小橙子 2014-02-13
  • 打赏
  • 举报
回复
引用 5 楼 Idle_Cloud 的回复:
fork出来了一个子进程,堵塞的是子进程,没有堵塞主进程啊。
我的主进程在wait
Linux-Torvalds 2014-02-13
  • 打赏
  • 举报
回复
引用 3 楼 zhugesummer 的回复:
[quote=引用 1 楼 Idle_Cloud 的回复:] 带了&后,返回是会一直成功的,你可以改下你的设计啊,fork出一个进程来,然后执行程序的时候不要&就好了。
因为我想要确定hello是否被sh执行,所以需要在主进程中wait; 另一方面,不想hello的执行一直阻塞主进程,所以采用了& 我的目标是:让hello在不阻塞主进程的情况下,还能告诉主进程他是否已经执行 谢谢~[/quote]fork之后,exec执行,是没有block父进程的。
Carl_CCC 2014-02-13
  • 打赏
  • 举报
回复
fork出来了一个子进程,堵塞的是子进程,没有堵塞主进程啊。
summer小橙子 2014-02-13
  • 打赏
  • 举报
回复
引用 3 楼 zhugesummer 的回复:
[quote=引用 1 楼 Idle_Cloud 的回复:] 带了&后,返回是会一直成功的,你可以改下你的设计啊,fork出一个进程来,然后执行程序的时候不要&就好了。
因为我想要确定hello是否被sh执行,所以需要在主进程中wait; 另一方面,不想hello的执行一直阻塞主进程,所以采用了& 我的目标是:让hello在不阻塞主进程的情况下,还能告诉主进程他是否已经执行 谢谢~[/quote] 有没有这种需求的解决方法?

23,120

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧