如果路径错误,execvp()返回值

时间:2019-02-12 15:13:17

标签: c shell execvp

我目前正在用C编写自定义外壳脚本。为了执行命令,我使用execvp()函数。例如:

if((execvp(args[0], args)) == -1) //args is a char **array containing the commands arguments
{
    printf("ERROR: Wrong command\n");
    exit(EXIT_FAILURE);
}

问题是,当两个命令之间用“ &&”分隔时,如果第一个命令未执行(因此execvp将返回-1),则整个过程必须中断,然后再转到下一个命令。例如,如果我写了“ << strong> 一些随机错误命令 && ls”,它就可以正常工作。

尽管,如果我写了“ ls << strong> 一些随机错误路径 && ls”之类的东西,execvp()将正常执行,并显示以下消息:< / p>

  

ls:无法访问“ ...”:没有此类文件或目录

然后它将转到下一个命令。显然,在那种情况下execvp()不会返回-1。

在这种情况下,execvp()是否还返回其他任何值?如果没有,如何在执行命令之前检查路径是否存在?

编辑 我只检查status的值(在父级等待子级终止时由wait(&status)生成)。如果它不为零,则表示该命令未执行。

2 个答案:

答案 0 :(得分:3)

  

在这种情况下,execvp()是否还返回其他任何值?

execvp在这种情况下不会返回 any 值,因为它成功运行了您要求的命令。除非已成功执行ls,否则您将无法从ls收到错误消息。您可能打算使&&不仅在exec故障时短路,而且在成功执行的exec上短路,其中exec进程返回非零状态代码(如wait / {{1所示) }}。

  

如果没有,如何在执行命令之前检查路径是否存在?

通常来说,这没有任何意义。 shell对运行的命令如何解释其参数进行假设是不正常的,例如其中之一应该是现有文件的名称。即使您 did 有这种特殊情况,它也会受到竞争条件的影响(shell检查时该文件存在,而waitpid运行时该文件不存在,反之亦然)。

答案 1 :(得分:1)

  

尽管如此,如果我写类似“ ls <一些随机错误的路径> &&   ls“,execvp()将正常执行,并显示以下消息:

     
    

ls:无法访问“ ...”:没有此类文件或目录

  
     

然后它将转到下一个命令。显然,在这种情况下execvp()   不返回-1。

execvp()的返回值报告是否成功执行了替换过程映像。它与任何替换的退出状态没有关系。当然,它只会在无法用新的映像替换当前过程映像时完全返回。这是它 唯一可行的方法,因为必须先成功加载并启动替换映像,然后才能确定其退出状态,并且此时先前的映像不再可用于返回

  

在这种情况下,execvp()是否还返回其他任何值?

否。

  

如果没有,   在执行命令之前如何检查路径是否存在?

那是错误的策略。您的外壳将需要知道如何验证所有可能执行的每个命令的操作数,以便在一般情况下能够正常工作。对于允许执行任意程序的外壳来说,这根本是不可能的。

您需要做的是通过waitwaitpid获取第一个进程的退出状态。如果您正在远程进行此操作,那么您已经在使用其中一个来等待第一个进程的终止,然后再启动第二个进程,并且自然地,您无法确定退出状态,直到该进程真正终止为止。 wait()waitpid()函数可以分别提供一个int“状态”代码,您可以从中提取有关终止过程的各种信息,包括正常终止的过程信息。退出状态。