C - 将未知命令传递给execvp()

时间:2010-10-13 21:19:37

标签: shell execvp

我正在编写一个假shell,在那里我创建一个子进程,然后调用execvp()。在普通的shell中,当我输入一个未知的命令,例如'hello'时,它返回'hello:Command not found'。但是,当我将hello传递给execvp()时,它默认情况下不会返回任何错误,只是继续运行我的程序的其余部分,就像没有发生任何事情一样。什么是最简单的方法来确定是否实际上没有运行?这是我的代码:

if(fork() == 0)
{
     execvp(cmd, args);
}
else
{
     int status = 0;
     int corpse = wait(&status);
     printf(Child %d exited with a status of %d\n", corpse, status);
}

我知道如果尸体< 0,那么这是一个未知的命令,但我的代码中还有其他条件未列出,我不想等待(例如,如果&在命令的末尾输入)。有什么建议吗?

2 个答案:

答案 0 :(得分:3)

如果出现错误(exec已正确设置),则所有errno方法都可以返回-1。您没有检查execvp的结果,所以如果失败,程序的其余部分将继续执行。您可以使用这样的方法来阻止程序的其余部分执行:

if (execvp(cmd, args) == -1)
    exit(EXIT_FAILURE);

您还想检查fork()的结果是否为< 0。

答案 1 :(得分:0)

您有两个独立的问题。

1)是execvp的返回值。它不应该回来。如果确实存在问题。这是我得到的一个错误的命令execvp。如果execvp失败,您不想等待。始终检查返回值。

int res = execvp(argv[1], argv);
printf ("res is %i %s\n", res, strerror(errno));
// => res is -1 No such file or directory

2)另一个问题是后台进程等。这是shell的工作,你需要弄清楚你的程序何时应该立即等待,以及何时想要从fork中保存pid并稍后再等待它。