作业题目
要求在原有代码的基础上,实现shell的三类基础命令,它们包括:
- 简单命令(可执行的程序命令,如ls等)
- I/O重定向命令,如:
|
|
- 管道命令(pipe),如:
|
|
设计思路
原有代码中定义了输入命令的基础结构体,即 struct cmd。这个结构体就一个成员type,用于记录输入命令的类型: ‘ ‘ 表示简单可执行命令 ‘|’ 表示管道命令, ‘<’ 和’>’ 表示I/O重定向命令。
每一个类型分别继承cmd基础结构体,派生出对应的三类结构体:
经过分析,设计了以下的运行流程,其中,管道命令的解析和运行是通过递归函数实现的。
具体实现
在所给代码中,void runcmd(struct cmd *cmd)这个函数是真正驱动调用实现shell基础功能的核心。通过调用系统接口函数 execv(), open(), close(), dup(), pipe()和在原有代码的基础上,来实现目标功能。
实现简单命令
|
|
|
|
实现I/O重定向命令
|
|
|
|
实现管道(pipe)命令
|
|
完整代码
|
|