用C编写自己的shell,如何运行Unix可执行文件?
在我的一门课程中,我们正在编写自己的shell(基本上是从头开始) 我们已经编写了一个lexer和一个解析器来将输入划分成更容易处理的漂亮的“命令”结构。同样,我有一个函数用C编写自己的shell,如何运行Unix可执行文件?,c,shell,unix,path,C,Shell,Unix,Path,在我的一门课程中,我们正在编写自己的shell(基本上是从头开始) 我们已经编写了一个lexer和一个解析器来将输入划分成更容易处理的漂亮的“命令”结构。同样,我有一个函数read_command(),它将一次读入一个命令,并找出它是什么类型的命令(pipe/和/或/simple/等等) 我现在正在尝试编写execute_命令(structcommand cmd)函数,该函数实际接收并运行该命令。我甚至在苦苦思索如何开始编写这个函数 假设我得到一个非常简单的catfoo.txt命令。我的命令结构
read_command()
,它将一次读入一个命令,并找出它是什么类型的命令(pipe/和/或/simple/等等)
我现在正在尝试编写execute_命令(structcommand cmd)
函数,该函数实际接收并运行该命令。我甚至在苦苦思索如何开始编写这个函数
假设我得到一个非常简单的catfoo.txt
命令。我的命令结构将把它整齐地分割开来,这样我就有了一个包含这两个单词的单词数组
现在我想用参数foo.txt
运行cat
可执行文件。我意识到我应该使用$PATH
变量来尝试查找可执行文件,然后使用此参数运行它
我正在努力解决几个主要问题:
cat
?请记住,这个程序使用C。我可以使用什么函数来搜索目录?如何使用路径来执行此操作cat
时,如何使用foo.txt
作为参数运行它?如何在C语言中实现这一点手册页本身或对其中任何函数进行简单的谷歌搜索都会显示大量的示例来帮助您进行操作。您将命令字符串拆分为单独的字符串(命令名、参数),并将它们存储在以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[]);