execvp() return 路径错误时的值
execvp() return value if path is wrong
我目前正在用 C 编写自定义 shell 脚本。为了执行命令,我使用了 execvp() 函数。例如:
if((execvp(args[0], args)) == -1) //args is a char **array containing the commands arguments
{
printf("ERROR: Wrong command\n");
exit(EXIT_FAILURE);
}
问题是,当 2 个命令由“&&”分隔时,如果第一个命令未执行(因此,execvp 将 return -1)整个过程必须中断才能进入下一个一。它工作得很好,例如,如果我写“<some random wrong command> && ls”.
虽然,如果我写类似“ls <some random wrong path> && ls”,execvp() 将被执行通常,并打印消息:
ls: cannot access '...': No such file or directory
然后它将转到下一个命令。显然,在那种情况下 execvp() 不会 return -1。
在这种情况下,execvp() return 是否还有其他值?如果不存在,如何在执行命令前检查路径是否存在?
编辑
我只是检查 status 的值(在父等待子终止时由 wait(&status) 生成)。如果它不为零,则表示该命令未执行。
Is there any other value that execvp() returns in that case?
execvp
在这种情况下没有 return 任何 值,因为它在 运行 您要求的命令中成功。除非 ls
已成功执行,否则您无法从 ls
获得错误。您可能意味着您的 &&
不仅在 exec 失败时短路,而且在成功的 exec 上短路,其中 exec 进程 return 是一个非零状态代码(如 wait
所示/ waitpid
).
If not, how can I check if the path exists before executing the command?
一般来说,这没有任何意义。 shell 假设 运行 的命令将如何解释它们的参数是不正常的,例如其中一个应该是现有文件的名称。即使您 确实 有这样的特殊情况,它也会受到竞争条件的影响(文件在 shell 检查时存在,但在 ls
运行时不存在,反之亦然)。
Although, if I write something like " ls <some random wrong path> &&
ls ", execvp() will be executed normally, and print the message:
ls: cannot access '...': No such file or directory
然后它将转到下一个命令。显然,在那种情况下 execvp()
不 return -1.
execvp()
的 return 值报告替换过程映像是否已成功执行。它与任何替换的退出状态无关。当然,只有 returns 才能用新的过程映像替换当前的过程映像。这是它 可以 工作的唯一方法,因为替换图像必须在确定其退出状态之前成功加载和启动,并且在那时之前的图像不再可用return 到.
Is there any other value that execvp() returns in that case?
没有
If not,
how can I check if the path exists before executing the command?
这是错误的策略。您的 shell 需要知道如何验证它可能执行的每个命令的所有操作数,以便在一般情况下正常工作。对于允许执行任意程序的shell来说,这根本不可能。
您需要做的是通过wait
或waitpid
获取第一个进程的退出状态。如果您甚至远程正确地执行此操作,那么您已经在使用其中一个在启动第二个进程之前等待第一个进程的终止,并且自然地,您无法确定退出状态,直到进程实际终止。 wait()
和 waitpid()
函数都可以提供一个 int
"status" 代码,您可以从中提取有关终止进程的各种信息,包括正常终止的情况, 它的退出状态。
我目前正在用 C 编写自定义 shell 脚本。为了执行命令,我使用了 execvp() 函数。例如:
if((execvp(args[0], args)) == -1) //args is a char **array containing the commands arguments
{
printf("ERROR: Wrong command\n");
exit(EXIT_FAILURE);
}
问题是,当 2 个命令由“&&”分隔时,如果第一个命令未执行(因此,execvp 将 return -1)整个过程必须中断才能进入下一个一。它工作得很好,例如,如果我写“<some random wrong command> && ls”.
虽然,如果我写类似“ls <some random wrong path> && ls”,execvp() 将被执行通常,并打印消息:
ls: cannot access '...': No such file or directory
然后它将转到下一个命令。显然,在那种情况下 execvp() 不会 return -1。
在这种情况下,execvp() return 是否还有其他值?如果不存在,如何在执行命令前检查路径是否存在?
编辑 我只是检查 status 的值(在父等待子终止时由 wait(&status) 生成)。如果它不为零,则表示该命令未执行。
Is there any other value that execvp() returns in that case?
execvp
在这种情况下没有 return 任何 值,因为它在 运行 您要求的命令中成功。除非 ls
已成功执行,否则您无法从 ls
获得错误。您可能意味着您的 &&
不仅在 exec 失败时短路,而且在成功的 exec 上短路,其中 exec 进程 return 是一个非零状态代码(如 wait
所示/ waitpid
).
If not, how can I check if the path exists before executing the command?
一般来说,这没有任何意义。 shell 假设 运行 的命令将如何解释它们的参数是不正常的,例如其中一个应该是现有文件的名称。即使您 确实 有这样的特殊情况,它也会受到竞争条件的影响(文件在 shell 检查时存在,但在 ls
运行时不存在,反之亦然)。
Although, if I write something like " ls <some random wrong path> && ls ", execvp() will be executed normally, and print the message:
ls: cannot access '...': No such file or directory
然后它将转到下一个命令。显然,在那种情况下 execvp() 不 return -1.
execvp()
的 return 值报告替换过程映像是否已成功执行。它与任何替换的退出状态无关。当然,只有 returns 才能用新的过程映像替换当前的过程映像。这是它 可以 工作的唯一方法,因为替换图像必须在确定其退出状态之前成功加载和启动,并且在那时之前的图像不再可用return 到.
Is there any other value that execvp() returns in that case?
没有
If not, how can I check if the path exists before executing the command?
这是错误的策略。您的 shell 需要知道如何验证它可能执行的每个命令的所有操作数,以便在一般情况下正常工作。对于允许执行任意程序的shell来说,这根本不可能。
您需要做的是通过wait
或waitpid
获取第一个进程的退出状态。如果您甚至远程正确地执行此操作,那么您已经在使用其中一个在启动第二个进程之前等待第一个进程的终止,并且自然地,您无法确定退出状态,直到进程实际终止。 wait()
和 waitpid()
函数都可以提供一个 int
"status" 代码,您可以从中提取有关终止进程的各种信息,包括正常终止的情况, 它的退出状态。