我正在编写一个假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,那么这是一个未知的命令,但我的代码中还有其他条件未列出,我不想等待(例如,如果&在命令的末尾输入)。有什么建议吗?
答案 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并稍后再等待它。