[英]Shell in C - how to read and execute user input?
我的任务是用C语言编写一个非常简单的shell。我给出的源代码并不多,我刚刚开始学习C语言,我只使用了scanf()
和printf()
以及简单的编码函数。 我只知道它应该用fork()
和不同的exec()
编写。 我花了很多时间分析其他外壳,但是我不了解程序的结构和某些功能,例如:
help()
或date()
并执行它们。 fgets()
然后使用strcmp()
吗? execvp()
如何知道用户输入是我的main
文件夹还是程序文件夹中的程序中的命令(函数)? 首先,让我说,对于一个刚刚学习C的人来说,这听起来像一个艰巨的任务,除非它受到非常仔细的限制。 您需要分析其他外壳没有任何意义。 我建议您与教学助理讨论作业的范围,以及根据您的经验应该做的事情。
不过,要回答您的问题:
为什么我们需要解析?
解析是(在这种情况下)采用一系列字符并产生一个数据结构,程序可以对其进行处理。 现在,如果不应该有任何参数,每行没有多个命令等,这可能是一个相当简单的结构。但是,您至少必须确保用户确实没有使用过参数,没有写下无效的命令线,封闭的括号等。
如果我知道我不会在命令中使用参数
该程序不是为可以预测其行为的完美用户编写的。 您必须容纳任何可以插入几乎所有内容的用户; 您需要注意这种情况并报告错误。
阅读用户输入。 使用
fgets()
然后使用strcmp()
吗?
请记住, fgets()
可能无法遍及整行-如果该行的长度大于缓冲区长度减1。但是也许可以保证行长度受到限制? 还是被允许在超长线路上失败?
同样,在某些情况下,可能允许用户使用多余的空格作为行的一部分,在这种情况下, strcmp()
可能不会给您想要的内容。
执行,它是如何工作的? execvp()如何知道用户输入是我的主文件夹还是程序文件夹中的程序中的命令(函数)?
看看execvp()
的手册页 (和朋友)。 基本上,调用execvp()
时发生的事情是运行指定位置的二进制文件,而其命令行是您作为execvp()
的第二个参数传递的。 假设您跑步
execvp("/path/to/foo", "/path/to/foo", "bar");
因此,将运行/path/to/foo
的程序。 像任何程序一样,其argv[0]
是其自身的路径。 其argc
将为2
,其argv[1]
将为"bar"
。 它的工作目录(以及用户和组ID)将是运行execvp()
的进程的当前目录以及用户和组ID,因此不一定是/path/to/foo
。
继续前面的示例,您可以执行以下操作:
chdir("/path/to");
execvp("foo", "foo", "bar");
那时foo
将以argv[0]
为foo
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.