基本C Shell实现:执行命令

时间:2015-11-17 12:24:33

标签: c shell

我遇到了一项工作,要求我在C语言中编写一个基本shell,以便在minix上运行,遵循下面的伪代码(1)。这是我第一次使用C,而且在一分钟之内它只是我的头脑。我刚刚设法编写程序的第一部分(提示用户输入,然后将输入解析为标记以分解为命令和参数)。但我正在努力执行命令。

我不是在寻找别人为我做的工作,然后给我答案,我真正需要的是帮助理解我需要做什么才能完成任务(即总体大纲,我可以使用的资源等。)

任何帮助将不胜感激!

*以下建议问题过于宽泛,我想指出我在这里遇到的主要问题是理解'execve'功能(即使在阅读了手册页后)

(1)

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
<select id="package">
  <option value="Package A">Package A</option>
  <option value="Package B">Package B</option>
</select>

<input type="text" id="the_total" name="total">
<input type="text" id="price" name="price">

1 个答案:

答案 0 :(得分:0)

正如您在下面的评论中提到的,如果这是您第一次使用C,那么您应该学习如何编写基本的 Hello World 程序而不是如何从头开始编写unix shell代码!

但是既然你问过,我会给你一些你已经拥有的代码片段的指南: - )

  • 首先,盲目调用fork()execve()是非常糟糕的做法,甚至不检查你的输入是否是有效的unix命令。
  • 您需要首先检查输入是否是可以实际执行的命令。为此,您必须找到(如果存在)输入命令的二进制文件。例如, ls 命令实际上是位于 / bin / ls 中的二进制文件。幸运的是,对于Unix用户来说,一个名为 PATH 的变量存储在environnement中会告诉shell在哪里查找二进制文件。
  • $> env将打印存储在环境中的所有变量。通过执行此操作,您将看到一条看起来像这样的行,具体取决于每个操作系统:
  

PATH = / usr / lib中/ QT-3.3 / bin中:在/ usr / local / sbin中:在/ usr / local / bin中:/ sbin目录:/ bin中:/ usr / sbin目录:在/ usr / bin中:/根/ bin中

此行包含多个与冒号“”连接的路径。这些路径对应于存储常见系统二进制文件的文件夹。

  • 因此,如果您要执行的命令存在,那么它的二进制文件应位于其中一个文件夹中!

    1. 作为主函数的第三个参数,您可以在C程序中检索char **env。迭代它直到找到 PATH 行。
    2. 将此行拆分为路径列表
    3. 迭代此列表,并为每条路径添加输入命令。然后,将它传递给非常方便的stat()函数,该函数将为您提供几个有用的信息(如果文件存在,如果它具有执行权限......)。
    4. ,阅读 man 2 stat 也会在本练习中为您提供很多帮助
    5. 在您的迭代中,如果创建的路径存在且具有执行权限,请保存此路径并稍后使用execve()执行该路径。否则,如果没有创建的路径存在(stat()返回-1)或没有正确执行,则输入可能不是命令。您还应该了解内置http://www.gnu.org/software/bash/manual/html_node/Bourne-Shell-Builtins.html#Bourne-Shell-Builtins
    6. $> which <command>对查找现有命令或别名非常有用

这应该可以帮助您完成整个过程,但我会建议您在fork()execve()上做几个教程。

祝你好运!