首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >execve的返回状态

execve的返回状态
EN

Stack Overflow用户
提问于 2013-03-19 18:42:24
回答 2查看 3.4K关注 0票数 5

我想把execve进程的退出状态0发送给启动它的进程。因为一旦成功,execve就再也不会回来了,所以在那之后我就不能做任何事情了。但我想知道execve是否运行成功。

提前感谢

EN

回答 2

Stack Overflow用户

发布于 2013-03-19 18:50:21

您可以使用FD_CLOEXEC验证exec是否成功

  • 创建一个子级,关闭管道的读取端,并在管道的写入端设置FD_CLOEXEC标志。然后继续使用exec。如果exec成功,则会因为FD_CLOEXEC而自动关闭管道。如果exec失败,则向管道写入一个字节并退出。
  • 在父级中,关闭管道的写入端并从读取端读取。如果您读取0字节(EOF),则表示exec成功。如果您在管道中读取一个字节,则表示exec失败。

在故障情况下通过管道写入的数据可用于传输错误信息,例如exec之后的errno的值。

为简洁起见,省略了错误检查的代码如下所示:

代码语言:javascript
复制
int pipe_fds[2];
pipe(pipe_fds);
if (!fork()) {
  close(pipe_fds[0]);
  fcntl(pipe_fds[1], F_SETFD, F_CLOEXEC);
  execve(...);
  write(pipe_fds[1], "", 1);
  _exit(1);
}
else {
  int n;
  char out;
  close(pipe_fds[1]);
  n = read(pipe_fds[0], &out, 1);
  if (n == 0)
    printf("exec successful\n");
  else
    printf("exec failed\n");
  close(pipe_fds[0]);
}

请注意,如果其他线程可能并行执行它们自己的进程,则此技术可能是不安全的。问题在于,在创建管道和设置close-on-exec标志之间存在延迟。如果不相关的线程在关键窗口期间派生和执行,子线程将继承pipe_fds[1],并且不会将其关闭,从而导致父线程挂起。可以使用特定于Linux的pipe2调用来修复此问题,该调用允许以原子方式创建设置了close-on-exec标志的管道。

票数 5
EN

Stack Overflow用户

发布于 2013-03-19 18:50:08

要等待fork() finish启动的进程,您可以使用wait()

代码语言:javascript
复制
/* parent */
int status;
while (wait(&status) != uproc.pid) {
    printf("waiting for child to exit");
    }

并基于此question

子对象的退出状态由status变量中的wait函数提供。

您可以使用WEXITSTATUS宏来获取退出状态,但前提是程序正常退出(即调用exit或从其main函数返回):

代码语言:javascript
复制
if (WIFEXITED(status))
    printf("Child exit status: %d\n", WEXITSTATUS(status));
else
    printf("Child exited abnormally\n");
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15497224

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档