我想将execve进程的退出状态0发送到启动它的进程。 因为在成功时,execve永远不会回来,所以我之后无法做任何事情。但是,如果execve成功,我想要。
先谢谢
答案 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");