我正在尝试在C中构建自己的shell作为类项目的一部分。我们需要使用execv并实现我们自己的路径。为了更好地理解这里的问题是:
默认情况下,路径列表为空,但可能会增长到任意大小。您应该实现内置命令来控制此变量:
path [+|- /some/dir]
path
(不带参数)显示以冒号分隔的列表中的所有条目,例如" / bin中:在/ usr /仓"
path + /some/dir
将给定的路径名追加到路径列表中。
path - /some/dir
从路径列表中删除给定的路径名。
到目前为止,我误读了作业并使用了execvp。请问您能否详细了解如何创建自己的路径变量,并为每个执行的命令搜索它所在的目录并将其添加到路径中?或者是否有使用execv编写的简单shell我可以看看?
我看到http://linuxgazette.net/111/ramankutty.html,但我发现搜索有点过于复杂,他使用了execve。
到目前为止,我有char * mypath变量,最初为null。但是用户可以使用路径+ some / dir或path - / some / dir添加或删除。 execv的语法是execv(" / some / dir",argv)我如何搜索可执行文件的路径并将其传递给execv ....例如mypath = / bin / ls;当我通过execv(mypath,argv)时它不起作用...所以我如何将路径传递给execv?
答案 0 :(得分:1)
我猜你应该使用excev
的原因正是它没有考虑环境的路径,但是调用必须提供函数的完整路径。
由于这是一个类项目,你应该编写你的代码 - 编写代码就是你学习如何做事的方式,而不仅仅是从互联网上复制粘贴,所以我不会写代码解决问题,而是描述解决方案。
您需要保留一个路径条目列表 - 通过path + some/dir
和path - some/dir
机制进行调整 - 所以这些命令需要在shell中处理,当然,它们应该添加/删除从您的路径条目列表。
当您执行某些操作时,输入“mycommand”,您将必须扫描路径条目列表,并检查路径条目指定的目录中是否存在名为“mycommand”的文件可以执行的(在目录条目中设置了执行位)。如果是这样,请在当前路径条目的字符串上调用execv
并连接“mycommand”。 (您可以生成连接字符串并使用stat
函数来获取有关文件的信息,例如)
检查错误,并报告是否出现问题。
请不要试图在互联网上找到别人的外壳。这不是你学习的方式,如果你实际上没有从课堂练习中学到东西,那么一旦你完成学业,你很可能不会成功 - 而这最终是为什么你要上学,对吧?