【1】Linux 命令环境下 C 语言实践_用 C/C++构造一个简单的 shell

本文内容较长,分章节描述,后续出【2】-【5】,待更新…

一、 实验目的

1. 用 C/C++构造一个简单的 shell;
2. 理解 shell 程序的功能;
3. 学会 shell 的使用;
4. 掌握基本的 makefile 方法。

二、 实验内容

- 基本任务 1: 用 C/C++编写一个简单的 shell 程序,实现以下基本的命令。

1) 浏览目录和文件的各种属性 ls(可以不支持参数)
2) 回显命令 echo
3) 显示文件内容 cat
4) 创建目录 mkdir
5) 删除文件 rm
6) 切换目录 cd
7) 显示当前目录 pwd
8) 文字统计 wc

- 基本任务 2:写一个 makefile 来管理这些源文件。

每一条命令单独对应一个源程序文件,不允许所有命令一个源文件。
写一个 makefile 来管理这些源文件。

- 基本任务 3: 写清楚 make 编译和运行的过程。

- 选做任务(选作内容看下一篇文章【4】)

链接:文章【4】链接

1.任何你想实现的其他命令
2.提供友好的人机界面:例如提供命令列表、命令查询、命令帮助等。

三、 实验步骤

1、主函数

每一个命令对应一个 C 文件, 有 sh_cat.c, sh_cd.c, sh_echo.c, sh_list.c, sh_ls.c, sh_man.c, sh_mkdir.c, sh_pwd.c, sh_rm.c,sh_wc.c
在这里插入图片描述3374_mysh.c 文件: 这个文件有三个函数以及对命令执行函数的调用。
main()函数是程序入口, 负责每次命令结束后循环出现下一次命令的接口, 并且将命令放
入整行中, 最多放 10 个历史, 如果超过 10 个命令, 则命令整行对前一行进行覆盖。 并循环调用了 make()函数;
在这里插入图片描述make()函数的作用是将命令分开并保存在argc和argv[]中, 在函数末尾调用do_exec()函数,
并把 argc 和 argv[]作为每一个命令函数的传入参数;
在这里插入图片描述
Action()函数的作用是进行命令匹配, 根据传入的字符串数组的第一个字符串来判断应该
调用哪个命令执行函数, 并将两个参数传入命令执行函数。
在这里插入图片描述
对命令执行函数的调用:
在这里插入图片描述

2、sh_ls.c 文件:

这个文件用来实现 linux 下的 ls 命令, 包含了两个参数-a 和-l。
ls 命令用于显示文件目录列表,和 Windows 系统下 DOS 命令 dir 类似。当执行 ls 命令时,默认显示的只有非隐藏文件的文件名、以文件名进行排序及文件名代表的颜色显示。当不加参数时,默认列出当前目录的列表信息。 ls 命令使用频率非常高,参数也非常多,多达四五十个,
ls [选项] [目录或文件名]
参数:
-a: --all 的缩写,显示所有的文件,包括隐藏文件(以.开头的文件)。
-l:列出长数据串,显示出文件的属性与权限等数据信息
大体思路就是将从终端传进来的参数和路径进行判断,找出参数列表和路径列表,经当前
工作目录转到传进来的路径下,将路径下的所有文件读取到文件中,然后对参数列表进行解析,不同的参数输出不同的文件信息。对于其他参数没有什么难度,就是加上一定的判断条件然后对链表中的文件的参数进行选择性的输出就可以实现功能。难点在于如何将文件夹中的所有文件都存进内存再解析显示出来。
在这里插入图片描述

3、sh_cat.c 文件

这个文件用来实现 linux 下的 cat 命令, 包括-n 参数。
cat [选项] [文件]
cat 主要有三大功能:
1.一次显示整个文件。 $ cat filename
2.从键盘创建一个文件。 $ cat > filename
只能创建新文件,不能编辑已有文件.
3.将几个文件合并为一个文件: $cat file1 file2 > file
参数:
-n 或 --number 由 1 开始对所有输出的行数编号
采用 putc 和 getc 相结合的手段,从文件开头一个字符一个字符地读取,然后存放于 stdout
中,在换行和文件结束时打印出来。 对于 cat -n 命令,就需要一行一行地读取,在打印的时候
在每一行前加上行号。
在这里插入图片描述

其他文件详细内容见下篇文章【2】

链接:文章【2】链接

四、 make编译和运行

1、Makefile 文件:

在这里插入图片描述每个命令单独的源文件

在这里插入图片描述

2、编译和运行

在这里插入图片描述在这里插入图片描述

1.ls 命令

在这里插入图片描述在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.echo 命令

在这里插入图片描述

其他命令的运行结果请看下一篇文章【3】

链接:文章【3】链接

五、设计文档

包括以下内容:

(1) 编写 Shell 程序目的
(2) 运行环境
(3) Shell 简介
(4) 需求概述
(5) 系统分析
(6) 模块设计
(7) 流程图

具体内容见下一篇文章【5】

链接:文章【5】链接

模块设计:

在这里插入图片描述

流程图

在这里插入图片描述

六、注意事项

(1) 当没有命令输入的时候, 会无限循环

在这里插入图片描述(2) 对于较大的.C 文件, wc 无法进行统计计数。
在这里插入图片描述(3) 在运行 ls -l 的命令时, 如果要指定地址, 末尾必须带“/”, 因为要在程序中拼接地址。

  • 12
    点赞
  • 86
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 12
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

手可摘辰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值