我想把execve进程的退出状态0发送给启动它的进程。因为一旦成功,execve就再也不会回来了,所以在那之后我就不能做任何事情了。但我想知道execve是否运行成功。
提前感谢
发布于 2013-03-19 18:50:21
您可以使用FD_CLOEXEC验证exec是否成功
FD_CLOEXEC标志。然后继续使用exec。如果exec成功,则会因为FD_CLOEXEC而自动关闭管道。如果exec失败,则向管道写入一个字节并退出。exec成功。如果您在管道中读取一个字节,则表示exec失败。在故障情况下通过管道写入的数据可用于传输错误信息,例如exec之后的errno的值。
为简洁起见,省略了错误检查的代码如下所示:
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标志的管道。
发布于 2013-03-19 18:50:08
要等待fork() finish启动的进程,您可以使用wait()
/* parent */
int status;
while (wait(&status) != uproc.pid) {
printf("waiting for child to exit");
}并基于此question
子对象的退出状态由status变量中的wait函数提供。
您可以使用WEXITSTATUS宏来获取退出状态,但前提是程序正常退出(即调用exit或从其main函数返回):
if (WIFEXITED(status))
printf("Child exit status: %d\n", WEXITSTATUS(status));
else
printf("Child exited abnormally\n");https://stackoverflow.com/questions/15497224
复制相似问题