c - 使用 execv 在 C 中编写自己的 shell

标签 c shell execv

我正在尝试用 C 语言构建自己的 shell,作为类(class)项目的一部分。我们需要使用 execv 并实现我们自己的路径。为了更好地理解这里的问题:

The list of paths is empty by default, but may grow to any arbitrary size. You should implement a built-in command to control this variable:

path [+|- /some/dir]
  • path (without arguments) displays all the entries in the list separated by colons, e.g. "/bin:/usr/bin".

  • path + /some/dir appends the given pathname to the path list.

  • path - /some/dir removes the given pathname from the path list.

到目前为止,我误读了作业并使用了 execvp。请您详细说明如何创建我自己的路径变量,以及对于执行的每个命令搜索它所在的目录并将其添加到路径中?或者有没有使用 execv 编写的简单 shell 我可以看一下?

我看到了http://linuxgazette.net/111/ramankutty.html ,但是我发现搜索有点太复杂了,他用的是execve。

到目前为止,我有 char *mypath 变量,最初为空。但用户可以使用路径 + some/dir 或路径 -/some/dir 添加或删除。 execv 的语法是 execv("/some/dir", argv) 我如何搜索可执行文件的路径并将其传递给 execv....例如 mypath=/bin/ls ;当我传递 execv(mypath, argv) 时它不起作用...那么我如何将路径传递给 execv?

最佳答案

我猜测您应该使用 excev 的原因恰恰是它没有考虑环境的路径,但调用必须提供函数的完整路径。

由于这是一个类项目,所以你应该编写代码 - 编写代码是你学习如何做事的方式,比从互联网上复制粘贴要重要得多,所以我不打算编写代码解决问题,而是描述解决方案。

您将需要保留路径条目列表 - 通过 path + some/dirpath - some/dir 机制进行调整 - 因此这些命令需要当然,它们应该在您的 shell 内部处理,并且应该从您的路径条目列表中添加/删除。

当你开始执行某些操作时,假设输入了“mycommand”,你将必须扫描路径条目列表,并检查路径条目指定的目录中是否存在名为“mycommand”的文件可以执行(在目录项中设置了执行位)。如果是这样,请对当前路径条目和“mycommand”连接的字符串调用 execv。 (例如,您可以生成连接的字符串并使用 stat 函数来获取有关文件的信息)

检查错误,并报告是否出现问题。

请不要尝试在互联网上寻找其他人的 shell。这不是你学习的方式,如果你没有真正从类练习中学习,那么你完成学业后很可能不会成功 - 这就是你上学的最终原因,对吧?

关于c - 使用 execv 在 C 中编写自己的 shell,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25826294/

相关文章:

C语言-scanf更多输入但不知道有多少输入

c - 如何编写 "selective"Makefile?

bash - 在 shell 脚本中连接到 sqlplus 并运行 SQL 脚本

linux - 在 Bash shell 中获取和使用带有特殊字符的密码

c - execv 函数调用后当前程序会发生什么?

c - 如何在没有任何段错误的情况下在此函数中分配内存

c - fgets() 的异常行为

shell - 如何在重新启动后自动设置一次 "AT"计划作业

c - 使用 bin/time 时 Execv 不工作

c - execv 到 .c prog 使用相同的管道