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

2022/2/26 7:28:17

本文主要是介绍【2】Linux 命令环境下 C 语言实践_用 C/C++构造一个简单的 shell,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

用 C/C++编写一个简单的 shell 程序,实现以下基本的命令

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

1) 浏览目录和文件的各种属性 ls(可以不支持参数)

sh_ls.c 文件: 这个文件用来实现 linux 下的 ls 命令, 包含了两个参数-a 和-l。
ls 命令用于显示文件目录列表,和 Windows 系统下 DOS 命令 dir 类似。当执行 ls 命令时,默认显示的只有非隐藏文件的文件名、以文件名进行排序及文件名代表的颜色显示。当不加参数时,默认列出当前目录的列表信息。 ls 命令使用频率非常高,参数也非常多,多达四五十个。

ls [选项] [目录或文件名]
参数:
-a:--all 的缩写,显示所有的文件,包括隐藏文件(以.开头的文件)。
-l:列出长数据串,显示出文件的属性与权限等数据信息

大体思路就是将从终端传进来的参数和路径进行判断,找出参数列表和路径列表,经当前
工作目录转到传进来的路径下,将路径下的所有文件读取到文件中,然后对参数列表进行解析,不同的参数输出不同的文件信息。对于其他参数没有什么难度,就是加上一定的判断条件然后对链表中的文件的参数进行选择性的输出就可以实现功能。难点在于如何将文件夹中的所有文件都存进内存再解析显示出来。

在这里插入图片描述

2) 回显命令 echo

sh_echo.c 文件: 这个文件用来实现 linux 下的 echo 命令,

echo [-ne][字符串]或 echo [--help][--version]
补充说明: echo 会将输入的字符串送往标准输出。输出的字符串间以空白字符隔开, 并
在最后加上换行号。

用 while 循环, 根据 argc 的大小来打印。
在这里插入图片描述

3) 显示文件内容 cat

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 命令,就需要一行一行地读取,在打印的时候在每一行前加上行号。
在这里插入图片描述

4) 创建目录 mkdir

sh_mkdir.c 文件: 这个文件用来实现 linux 下的 mkdir 命令

语法: mkdir [选项] 目录...

通过 mkdir 命令可以实现在指定位置创建以 DirName(指定的文件名)命名的文件夹
或目录。要创建文件夹或目录的用户必须对所创建的文件夹的父文件夹具有写权限。
并且, 所创建的文件夹(目录)不能与其父目录(即父文件夹)中的文件名重名,即同一个
目录下不能有同名的(区分大小写)。
直接调用 POSIX 的 API 函数 mkdir(char*,[权限]) , 并将权限参数设置为 S_IRWXU。
在这里插入图片描述

5) 删除文件 rm

sh_rm.c 文件: 这个文件用来实现 linux 下的 rm 命令, 包括-r 参数。

语法: rm [选项]... 目录... 删除指定的<文件>(即解除链接)
参数: -r/R --recursive 同时删除该目录下的所有目录层

注意: 如果使用 rm 来删除文件,通常仍可以将该文件恢复原状。如果想保证该文件的内容无法还原,请考虑使用 shred。
若要删除一个目录,必须将给目录下的文件全部删除,系统调用 int remove(const char *
pathname)可以删除一个普通文件; 需要遍历目录中的每一项,而目录中可能还有目录, 故需要用递归调用; 每个目录下会有两个默认的目录.和…分别代表当前目录和上一目录,在遍历的时候需要忽略它们; 递归结束的条件是遍历到的文件为普通文件(此时会将普通文件删除);当一个目录中的内容全部被删除之后,便可以删除该目录了。
在这里插入图片描述在这里插入图片描述

6) 切换目录 cd

sh_cd.c 文件: 这个文件用来实现 linux 下的 cd 命令, 包括参数-(表示上一次到达的
目录) 和~(表示起始家目录) 。

语法:
cd [相对路径或绝对路径或特殊符号]
不加参数时,默认切换到用户主目录,即环境变量 HOME 指定的目录,如 root 用户的
HOME 变量为/root,那么 cd 命令不带参数时便切换到/root 目录下。
特殊符号包括~、 -、 ..等。
~表示用户主目录,即 HOME 变量指定的目录,如 root 用户的主目录为/root。
-表示前一个工作目录。
..表示上级目录。

对于 cd 命令, 需要 POSIX 标准操作系统, API 头文件 unistd.h 下的函数 chdir(char*) ,对于 cd -而言,需要用两个全局变量保存上一个路径和当前路径,在 cd 操作末尾刷新这两个变量。
在这里插入图片描述

7) 显示当前目录 pwd

sh_pwd.c 文件: 这个文件用来实现 linux 下的 pwd 命令,

语法: pwd [OPTION]...

pwd 命令用于显示工作目录。
执行 pwd 指令可立刻得知您目前所在的工作目录的绝对路径名称。 直接调用 API 函数
getcwd(char *)函数返回当前路径并打印。
在这里插入图片描述

8) 文字统计 wc

sh_wc.c 文件: 这个文件用来实现 linux 下的 wc 命令, 包括-l,-c,-w 三个参数。

语法: wc [选项]文件...
统计指定文件中的字节数、字数、行数,并将统计结果显示输出。该命令统计指定文件中的字节数、字数、行数。如果没有给出文件名, 则从标准输入读取。 wc 同时也给
出所指定文件的总统计数。
参数:
-c 统计字节数。
-l 统计行数。
-w 统计字数。一个字被定义为由空白、跳格或换行字符分隔的字符串。

我们在文件中额外定义三个函数 wcline(char *), wcword(char *)和 wcchar(char *),分别是用来实现文件行数,文件单词数和字符数。 然后主函数中根据传入的参数按照需要来调用三个函数, 实现统计文件的功能。 其中大体的统计思路是, 统计函数, 从文件头依次读取文件内容。
对于统计字符数, 从文件头开始一次读取字符,然后读取一个计数+1,知道文件结束符 EOF。
对于统计单词数, 同样从文件开头开始读取字符, 只要是不包含空格的连续字符串就算做是一个单词,计数+1.
在这里插入图片描述在这里插入图片描述在这里插入图片描述



这篇关于【2】Linux 命令环境下 C 语言实践_用 C/C++构造一个简单的 shell的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程