使用execvp在Ubuntu上用C构建shell

时间:2012-11-22 21:42:56

标签: c linux

  1. 我打算在Ubuntu上用C编写一个简单的shell。 我想过使用exevcp()函数。 我只能运行“ls”命令,其他命令似乎都不起作用。 有人可以告诉我它为什么会发生,或者让我知道一个更好的构建shell的方法吗?

  2. 我的目的是建立这个shell;我不明白为什么我不能只使用命令行,并将其原样放入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);
    }
    
  3. 你能解释一下吗?

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

execvp()系统调用有两个参数:要执行的程序的名称,以及指向以空值终止的字符串列表的指针,这些字符串是命令的参数。

例如:

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

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

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