返回execve的状态

Roh*_*dal 3 c process exec

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

提前致谢

use*_*342 5

您可以验证EXEC 成功通过利用FD_CLOEXEC:

  • 创建一个管道.

  • 叉子.

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

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

在发生故障时通过管道写入的数据可用于传输错误信息,例如errnoafter的值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");
}
Run Code Online (Sandbox Code Playgroud)


MOH*_*MED 2

要等待进程完成fork()启动,您可以使用wait():

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

并基于这个问题

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

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

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