【问题标题】:own shell in C using execv使用 execv 在 C 中拥有自己的 shell
【发布时间】:2014-09-13 18:25:52
【问题描述】:

我正在尝试在 C 中构建自己的 shell,作为课程项目的一部分。我们需要使用 execv 并实现我们自己的路径。为了更好地理解这里是一个问题:

路径列表默认为空,但可以增长到任意大小。你应该实现一个内置命令来控制这个变量:

path [+|- /some/dir]
  • path(不带参数)显示列表中的所有条目,用冒号分隔,例如“/bin:/usr/bin”。

  • path + /some/dir 将给定的路径名​​附加到路径列表中。

  • path - /some/dir 从路径列表中删除给定的路径名​​。

到目前为止,我误读了作业并使用了 execvp。请你能阐明如何创建我自己的路径变量,并为每个执行的命令搜索它所在的目录并将其添加到路径中吗?或者有什么简单的用 execv 写的 shell 我可以看看?

我看到http://linuxgazette.net/111/ramankutty.html,但我发现搜索有点过于复杂,他使用 execve。

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

【问题讨论】:

  • 你到底卡在哪里了?您是否在概念上理解分配,但不知道实际编写代码?或者你不明白这个任务?你知道路径列表是什么,你应该用它做什么吗? (对于路径列表中的每个目录,在该目录中查找请求命令。)
  • 欢迎来到 Stack Overflow。帮助我们帮助您...尝试完成作业,如果您遇到困难,请发布您迄今为止尝试过的代码并解释您遇到的(一件或几件)事情。
  • 我理解我在如何设置我自己的路径时遇到困难的任务,当使用 execv 时搜索该路径......!
  • 您可能想要使用access(2),但您应该明确扫描您的路径,以便从命令名称和你的路。

标签: c shell execv


【解决方案1】:

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

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

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

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

检查错误,如果出现问题,请报告。

请不要试图在互联网上寻找别人的外壳。这不是你学习的方式,如果你没有真正从课堂练习中学习,一旦你完成学业,你很可能不会成功——这就是你最终上学的原因,对吧?

【讨论】:

  • 我不想复制粘贴代码。我已经实现了我的 shell,但我使用了直接搜索 PATH 的 execvp。现在我正在尝试使用 execv 来执行它,它需要一个本地路径我无法理解的是,当我使用自己的路径变量时,它一开始是空的,但是当它收到命令时,我应该找到命令的路径和将其添加到我的路径中。我该怎么做?
  • 我刚刚描述过。您必须识别路径命令,并保留路径条目列表,然后搜索该列表。尝试编写一些代码来处理路径条目列表[列表不一定意味着“链表”,只是保留多个路径的某种方式 - 您当然可以只制作一个长字符串并从该字符串中添加/删除。 ...]。一旦您将工作路径命令作为“shell 内部”命令,您应该编写一些代码来搜索查找哪个路径条目具有您要查找的命令。
  • 我明白要做什么...我不知道该怎么做...例如,如果用户输入 ls... 最初我的路径是空的,那么我在哪里搜索命令的位置以及如何将其附加到我自己的路径?这样 execv(path , argv[])...
  • @AnvitaPotluri:正如 Mats 所说,你的 shell 程序 only 必须在你的 shell 维护的路径列表中给定的目录中搜索命令。因此,如果用户输入ls 并且您的路径列表为空,那么您将打印一条错误消息,例如 ls: command not found。由用户(或系统管理员)使用您的 shell 提供的内部 path 命令来确保正确填充路径列表。通常这会在一些启动脚本中完成,就像 bash 对 /etc/profile 和 ~/.bashrc 所做的那样。
  • @MatsPetersson 我有一个工作路径命令,它以长字符串的形式存储。请您指导如何搜索路径并将其传递给 execv 命令....我得到了有关 stat 和 readdir 的部分...
猜你喜欢
  • 1970-01-01
  • 2011-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-23
相关资源
最近更新 更多