您可以验证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)
要等待进程完成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)