【发布时间】:2010-10-28 13:55:14
【问题描述】:
在我的简单自定义 shell 中,我从标准输入读取命令并使用 execvp() 执行它们。在此之前,我创建了当前进程的 fork,并在该子进程中调用 execvp(),之后,我调用 exit(0)。
类似这样的:
pid = fork();
if(pid == -1) {
perror("fork");
exit(1);
}
if(pid == 0) {
// CHILD PROCESS CODE GOES HERE...
execvp(pArgs[0], pArgs);
exit(0);
} else {
// PARENT PROCESS CODE GOES HERE...
}
现在,使用 execvp() 运行的命令可以返回错误,对吧?我想正确处理它,现在我总是调用 exit(0),这意味着子进程将始终处于“OK”状态。
如何从 execvp() 调用中返回正确的状态并将其放入 exit() 调用中?我是否应该只获取 execvp() 返回的 int 值并将其作为 exit() 参数而不是 0 传递。这是否足够且正确?
【问题讨论】:
-
execvp 不会返回(除非 pArgs[0] 不是有效的可执行文件),因此永远不会到达 exit(0) 语句。
-
"除非 pArgs[0] 不是一个有效的可执行文件" - exec* 可能失败的原因有很多,只有一个。权限、资源计数、内存 - errno 会告诉你。
-
如果 execvp() 确实失败了,你应该有 exit(1) 或 exit(EXIT_FAILURE) 或 exit(0) 以外的任何东西 - 以指示失败。
-
旁注:你可能想要
_Exit()而不是exit()。