用C编写自己的shell,如何运行Unix可执行文件?

用C编写自己的shell,如何运行Unix可执行文件?,c,shell,unix,path,C,Shell,Unix,Path,在我的一门课程中,我们正在编写自己的shell(基本上是从头开始) 我们已经编写了一个lexer和一个解析器来将输入划分成更容易处理的漂亮的“命令”结构。同样,我有一个函数read_command(),它将一次读入一个命令,并找出它是什么类型的命令(pipe/和/或/simple/等等) 我现在正在尝试编写execute_命令(structcommand cmd)函数,该函数实际接收并运行该命令。我甚至在苦苦思索如何开始编写这个函数 假设我得到一个非常简单的catfoo.txt命令。我的命令结构

在我的一门课程中,我们正在编写自己的shell(基本上是从头开始)

我们已经编写了一个lexer和一个解析器来将输入划分成更容易处理的漂亮的“命令”结构。同样,我有一个函数
read_command()
,它将一次读入一个命令,并找出它是什么类型的命令(pipe/和/或/simple/等等)

我现在正在尝试编写
execute_命令(structcommand cmd)
函数,该函数实际接收并运行该命令。我甚至在苦苦思索如何开始编写这个函数

假设我得到一个非常简单的
catfoo.txt
命令。我的命令结构将把它整齐地分割开来,这样我就有了一个包含这两个单词的单词数组

现在我想用参数
foo.txt
运行
cat
可执行文件。我意识到我应该使用
$PATH
变量来尝试查找可执行文件,然后使用此参数运行它

我正在努力解决几个主要问题:

  • 如何实际搜索命令
    cat
    ?请记住,这个程序使用C。我可以使用什么函数来搜索目录?如何使用路径来执行此操作
  • 当我找到命令
    cat
    时,如何使用
    foo.txt
    作为参数运行它?如何在C语言中实现这一点
  • 退房及其亲属。实际上,您可能不需要直接对目录执行任何操作,但如果需要,可以使用、等
  • 使用和或其一个相关项(是基本级别的API)

  • 手册页本身或对其中任何函数进行简单的谷歌搜索都会显示大量的示例来帮助您进行操作。

    您将命令字符串拆分为单独的字符串(命令名、参数),并将它们存储在以null结尾的字符指针数组中。然后分叉并将命令名和命令+参数传递给
    execvp()
    ,除非这是verboten。您最终也将不得不担心管道和I/O重定向,但基本思想保持不变

    char *args[MAXARGS];
    
    args[0] = "cat";
    args[1] = "foo.txt";
    args[2] = 0;
    
    if ((pid = fork()) == 0)
    {
        execvp(args[0], args);
        ...print error...
        exit(1);
        /* execvp() does not return unless there's an error */
    }
    else if (pid < 0)
        ...fork failed...
    else
        ...wait for child to finish - or start other commands, or ...
    

    它允许您指定要使用的搜索路径,即使您已经修复了环境。最基本的调用是
    execve()
    ;这由
    execvp()
    在幕后使用(可能通过
    execv()
    )。

    您不需要自己处理
    PATH
    execvp
    将为您完成此操作。
     int execvP(const char *file, const char *search_path, char *const argv[]);