execve的返回状态
等待您处理由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");
这不会验证'exec' *成功*,只是程序以成功状态退出。当执行长时间运行的程序时,这可能会产生差异。 – user4815162342 2013-03-19 10:51:04
您可以验证EXEC 通过成功使用FD_CLOEXEC
:
创建管道。
fork。
在子中,关闭管道的读取端,并在管道的写入端设置
FD_CLOEXEC
标志。然后继续exec
。如果exec
成功,则由于FD_CLOEXEC
,管道将自动关闭。如果exec
失败,则向管道写入一个字节并退出。在父项中,关闭管道的写入结束并从读取结束读取。如果读取0字节(EOF),则表示
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");
}
未能执行'exec',是否可以保证SIGCHLD信号将在EOF通知之前从孩子死亡关闭管道的事实中传递出来?我喜欢技术背后的想法;我只是想知道是否有比赛条件。 – 2013-03-19 11:05:07
@JonathanLeffler我不认为有任何这样的保证,但它不应该是必要的。如果'exec'失败,通过管道发送一些数据很容易消除歧义。 – user4815162342 2013-03-19 11:29:52
@JonathanLeffler我现在编辑的答案不再依赖'SIGCHLD'。 – user4815162342 2013-03-19 11:32:10
这个链接可以帮助你http://stackoverflow.com/questions/13532391/how-to-get-error- of-execvp-in-the-fork – MOHAMED 2013-03-19 10:44:26
OP希望父级知道孩子的'exec'成功进行。可以通过多种方式(通过管道或特殊的退出状态)向父节点报告“exec”失败,但“exec”成功很难确认,因为成功的'exec'定义意味着我们的进程不再运行。 – user4815162342 2013-03-19 10:53:25
@ user4815162342:用“* ...一个孩子的'exec' ... *”表示创建孩子本身的exec或由儿童完成的一个exec(这个转变是由exec创建的'由父母)? – alk 2013-03-19 11:07:20