0
  1. 我即将在 Ubuntu 上用 C 语言编写一个简单的 shell。我考虑过使用该exevcp()功能。我只能运行“ls”命令,其他命令似乎都不起作用。有人能告诉我为什么会这样,或者给我一个更好的方法来构建外壳的想法吗?

  2. 我的目的是构建这个外壳;我不明白为什么我不能直接使用命令行并将其按原样放入execvp()函数中。

    #include <stdio.h>
    #include <unistd.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    
    #include <string.h>
    #include <errno.h>
    
    int main(int argc,char **argv,char **envp)
    {
        char* args[] = {"history" , NULL};
    
        execvp(args[0],args);
    }
    

请给我解释一下好吗?

4

2 回答 2

3

exec(3)只能用于运行外部程序。history在大多数 shell 中是内置的,不能以这种方式运行。

于 2012-11-22T21:47:01.380 回答
1

系统execvp()调用有两个参数:要执行的程序的名称,以及指向作为命令参数的以空字符结尾的字符串列表的指针。

例如:

char *args[] = { "ls", "-l", "-t", "-r", ".", 0 };
execvp(args[0], args);
...report error...

您不能简单地将整个字符串传递给execvp()并期望它将其拆分;调用代码必须这样做。请注意,如果第一个参数指向的字符串execvp()包含斜杠,$PATH则不使用该机制来查找命令。使用 搜索普通名称(如图所示,"ls"$PATH

您还必须记住,一些命令,例如historycd,是 shell 内置的;没有可以运行以获得相同效果的外部可执行文件您将无法运行它们。其他命令,例如test(aka [) 通常作为内置命令实现,但通常也有一个二进制文件,/bin或者/usr/bin执行(或多或少)相同的工作,因此您可以调用它。

于 2012-11-22T22:11:24.850 回答