1

我正在编写一个假外壳,在其中创建一个子进程,然后调用 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);
}

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

4

2 回答 2

4

exec如果出现错误(errno设置得当),所有方法都可以返回 -1。你没有检查结果,execvp所以如果它失败了,你的程序的其余部分将继续执行。你可以有这样的东西来阻止你的程序的其余部分执行:

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

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

于 2010-10-13T21:28:52.850 回答
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 并稍后等待。

于 2010-10-13T21:37:49.957 回答