shell程序说明书(接上一篇:模拟实现一个简单的shell程序,实现一些简单的命令)

12 篇文章 2 订阅
7 篇文章 0 订阅

一.使用方法
1、显示当前所在目录的路径名(指令pwd)
在这里插入图片描述

2、列出指定目录名中的所有目录及文件(指令list)
在这里插入图片描述

3、改变当前工作目录(指令chadir)

在这里插入图片描述

4、新建目录(指令makedir),创建a1文件如下

在这里插入图片描述
5、删除目录(指令deldir),删除a1如下

在这里插入图片描述
6、退出命令解释程序(指令exit),如下退出后执行ls系统命令

在这里插入图片描述

7、重命名一个文件或目录(指令rename),如下把txt重命名为txt1
在这里插入图片描述

8、复制一个已存在的文件(指令copy),如下把txt1复制个txt2

在这里插入图片描述
9、在指定的目录及其子目录中查找指定的文件,并输出查找到的文件的绝对路径(指令find),寻址当前路径的txt1

在这里插入图片描述
10、输入指令错误时会提示,并可以重新输入,如下随意输入
在这里插入图片描述
二.概念原理
基本概念及原理:用Linux内核的一个发布版本系统(ubantu),安装vim并用其编写代码(dazuoye_shell_script.c),其中用到了很多系统函数,如:open(),close(),read(),write(),creat(),chdir(),opendir(),readdir(),rewinddir(),closedir(),rmdir(),mkdir(), getcwd()。写完代码后用gcc编译器编译dazuoye_shell_script.c成为可执行文件dazuoye_shell_script(gcc -o dazuoye_shell_script dazuoye_shell_script.c),通过这种方式完成一个类似shell的程序,这个程序可以完成某些命令。

三.完成情况
各种功能的完成详细情况(已经实现了哪些功能,哪些功能未实现或有什么bug):

这个程序拥有:显示当前所在目录的路径名(指令pwd),列出指定目录名中的所有目录及文件(指令list),改变当前工作目录(指令chadir),新建目录(指令makedir),删除目录(指令deldir),退出命令解释程序(指令exit),重命名一个文件或目录(指令rename),复制一个已存在的文件(指令copy),在指定的目录及其子目录中查找指定的文件,并输出查找到的文件的绝对路径(指令find),输入指令错误时会提示,并可以重新输入,其中有十个功能,目前测试这些功能都能达到自己想要达到的目的,还未发现有任何bug。

四.详细设计
1、十个头文件:
#include"stdio.h"
#include"string.h"
#include"unistd.h"
#include"string.h"
#include"sys/types.h"
#include"sys/stat.h"
#include"stdlib.h"
#include"dirent.h"
#include"stddef.h"
#include"fcntl.h"

2、一个定义常量:#define buffsize 1024
3、一个主函数int main(void);
4、十普通个子函数,分别实现十个功能,其函数定义为:
void pwd_();
void makedir_();
void deldir_();
void exit_();
void chadir_();
void list_();
void rename_();
void copy_();
void find_();
void error_();

5、系统函数:
C语言库函数中的比较函数:strcmp(),printf()
Linux系统函数:
open(),close(),read(),write(),chdir(), opendir(),readdir(),closedir(),rmdir(),mkdir(),getcwd()

上面子函数函数解析分别如下:
(1)strcmp()原型为:int strcmp(const char *str1, const char *str2)
作用是:比较字符串str1与str2,若str1>str2则返回值大于0,str1==str2返回值等于0,str1<str2返回值小于0;

(2)void pwd_()主要调用了getcwd()函数,其原型为char *getcwd(char *buf,size_t size),该函数会将当前工作目录的绝对路径复制到参数buffer所指的内存空间中,参数size为buf的空间大小。成功返回指向buf的指针,失败返回-1;作用打印当前绝对路径。

(3)void makedir_()主要调用int mkdir(const char *pathname,mode_t mode);*pathname是要创建目录名称(程序用char command1[30]),mode是目录权限,该程序用0755,意为拥有者可读可写可执行,而群组或其他人只能读跟执行,创建成功返回0,失败返回-1。作用创建新文件夹

(4)void exit_()里直接调用函数exit(0),意为系统正常退出,要是exit(1)则为错误退出。作用退出程序

(5)void deldir_()主要调用了int rmdir(const char *pathname);pathname为删除的目录(程序用char command2[30),可以是绝对路径及目录名,成功删除返回0,失败返回-1.作用删除目录

(6)void chadir_()主要调用int chdir(const char * path);path是路径(程序用char command3[50];),成功返回0,失败返回-1,作用改变当前路径

(7)void list_()主要调用DIR * opendir(const char * name),struct dirent * readdir(DIR * dir);int closedir(DIR dir);其中name表示要打开的文件名(程序用char command4[50];),成功则返回DIR 型态的目录流,打开失败则返回NULL(程序用DIR olist=NULL;)。dir为
DIR
型态的目录流,程序中指向olist指向的地址,成功则返回下个目录进入点。有错误发生或读取到目录文件尾则返回NULL(程序用struct dirent *entry;)。而完成上述操作后就关闭参数olist所指的目录流(用closedir(olist)),关闭成功则返回0,失败返回-1;作用列出指定目录名中的所有目录及文件;

(8)void rename_()主要调用int rename(char * oldname, char * newname);其中oldname是旧文件名,newname是新文件名(程序用char newname[30],oldname[30];),修改成功返回0,失败返回-1,作用修改文件名

(9)void copy_()主要调用int open(const char *pathname,int flags,int perms),int close(int fd),ssize_t read(int fd, void *buf, size_t count),ssize_t write(int fd, void *buf, size_t count),其中pathname是要打开的文件名(程序用char cp1[30]),flags是文件权限(程序用O_RDWR|O_CREAT,意为读写方式打开文件,如果改文件不存在,就创建一个新的文件,并用第三个参数为其设置权限),则 perms也是设置权限的(程序中值是0664,意为八进制,拥有者,群组人员可读可写,其他人只能读),成功返回文件描述符,失败返回-1(程序用int fd1,fd2)。read()中fd也是文件描述符,把读到的字符存到buf中,count是读到的字节数,成功返回读到的字节数,失败返回-1(程序用int n)。write()中fd也是文件描述符,把数据来源为 buf,count是写入的字节数,成功返回写入的字节数,失败返回-1。close()中fd也是文件描述符,关闭成功返回0,失败返回-1.作用复制一个已存在的文件 (char cp1[30],cp2[30])。

(10)void find_()主要调用了gets(),strcmp(),int chdir(const char *path ),char *getcwd(char *buf,size_t size),DIR * opendir(const char * name),struct dirent * readdir(DIR * dir);int closedir(DIR *dir);用到的变量char *path1;char str1[30],str2[30];struct dirent *re;int j=0;DIR *dir;该函数的实现是利用上述多个函数互相配合完成的,用opendir,readdir扫描目录及其子目录中查找指定的文件,用strcmp()比较与文件匹配是否一致,一致就用chdir()转入目录,再用getcwd()获取当前绝对路径,然后在利用chdir()返回原来的路径,若输入出错会有提示,用int j标志,当j==0时,就错误。作用在指定的目录及其子目录中查找指定的文件,并输出查找到的文件的绝对路径。

(11)void error_()函数是输出命令错误时打印出input default!提示。作用提示输入错误

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值