2010-10-13 55 views
0

我正在写一个假壳,在那里我创建一个子进程,然后调用execvp()。在正常的shell中,当我输入一个未知的命令如'hello'时,它会返回'hello:Command not found'。但是,当我将hello传入execvp()时,默认情况下它不会返回任何错误,只是继续运行我的程序的其余部分,就像没有任何事情发生一样。找出没有实际运行的最简单方法是什么?这里是我的代码:C - 传递一个未知的命令到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,那么它是一个未知的命令,但在我的代码未列出的其他条件,在这里我不想等待(进入如如果&在命令结束时)。有什么建议么?

回答

3

如果出现错误(适当设置了errno),所有exec方法都可以返回-1。您没有检查execvp的结果,因此如果失败,程序的其余部分将继续执行。你可能有这样的事情,以防止你的程序的其余部分从执行:

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

你还需要检查的fork()结果为0 <

0

你有两个独立的顾虑。

1)是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并稍后再等待。