返回execve的状态

时间:2013-03-19 10:42:24

标签: c process exec

我想将execve进程的退出状态0发送到启动它的进程。 因为在成功时,execve永远不会回来,所以我之后无法做任何事情。但是,如果execve成功,我想要。

先谢谢

2 个答案:

答案 0 :(得分:5)

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

  • 创建一个管道。

  • 叉。

  • 在子项中
  • ,关闭管道的读取端,并在管道的写入端设置FD_CLOEXEC标志。然后继续exec。如果exec成功,则管道将因FD_CLOEXEC而自动关闭。如果exec失败,请将一个字节写入管道并退出。

  • 在父级中
  • ,关闭管道的写入端并从读取端读取。如果读取0字节(EOF),则表示exec成功。如果您读取管道中的一个字节,则表示exec失败。

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

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

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");
}

答案 1 :(得分:1)

等待fork()完成后启动的流程,您可以使用wait()

/* parent */
int status;
while (wait(&status) != uproc.pid) {
    printf("waiting for child to exit");
    }

并基于此question

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

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

if (WIFEXITED(status))
    printf("Child exit status: %d\n", WEXITSTATUS(status));
else
    printf("Child exited abnormally\n");