自己实现pwd和ls命令
文章目录
在我们的mybash版本1.0和mybash版本2.0中,通过执行程序fork一个子进程,然后再替换子进程实现了/usr/bin/目录下的命令操作,详情请看
写一个自己的bash1.0版本,
写一个自己的bash2.0版本,execvp会自动在路径下寻找到命令,我们通过echo查看一下路径
所以功能并不是我们自己实现的,现在我们就尝试着自己写一下pwd命令和ls命令
1.pwd命令
程序可以通过调用getcwd函数来确定自己的当前工作目录
**#include <unistd.h>
char getcwd(char buff,size_t size);
getcwd函数把当前目录的名字写到给定的缓冲区buff里。如果目录名的长度超出了参数size的缓冲区长度(一个ERANGE错误),比如你所在的目录特别深,它就返回NULL,如果成功,它返回指针buf。(在写一个自己的bash2.0版本中提及到)。
1.1编写pwd.c
代码如下:
1 #include<stdio.h>
2 #include<unistd.h>
3 #include<string.h>
4 #include<stdlib.h>
5
6 int main()
7 {
8 char buff[128] = { 0 };
9 if(getcwd(buff,128) != NULL )
10 {
11 printf("%s\n",buff);
12 }
13 exit(0);
14
15 }
1.2编译运行
当前目录打印了出来!
2.ls命令
Linux 系统上一个常见问题就是扫描目录,也就是确定一个特定目录下存放的文件。
与目录操作有关的函数在dirent.h头文件中声明。它们使用一个名为DIR的结构作为目录操作的基础。被称为目录流的指向这个结构的指针(DIR *)被用来完成各种目录操作,其使用方法与用来操作普通文件的文件流(FILE *)非常相似。
2.1opendir函数
opendir函数的作用是打开一个目录并建立一个目录流。如果成功,它返回一个指向DIR的指针,该指针用于读取目录数据项。
#include <sys/types.h>
#include <dirent.h>
DIR opendir(const charname);
opendir在失败时返回一个空指针。
2.2readdir
readdir函数返回一个指针,该指针指向的结构里保存着目录流dirp中下一个目录项的有关资料。后续的readdir调用将返回后续的目录项。如果发生错误或者到达目录尾,readdir将返回NULL。
**#include <sys/types.h>
#include <dirent.h>
struct dirent readdir(DIR dirp)
dirent结构中包含的目录项内容包括以下部分。
ino_t d_ino:文件的inode节点号。
char d_name[]:文件的名字。
2.3closedir 函数
closedir函数关闭一个目录流并释放与之有关的资源。它在执行成功时返回0,发生错误时返回-1。
*#include <sys/types.h>
#include <dirent.h>
int closedir(DIR dirp);
2.4 编写ls.c
代码如下:
1 #include<stdio.h>
2 #include<unistd.h>
3 #include<string.h>
4 #include<stdlib.h>
5 #include<dirent.h>
6
7 int main()
8 { //获取当前路径
9 char buff[128] = { 0 };
10 if(getcwd(buff,128) == NULL )
11 {
12 return 0;//获取当前路径失败,就直接退出程序
13 }
14
15 DIR * p = opendir(buff);//获取目录流
16 if( p == NULL )
17 {
18 return 0;
19 }
20
21 struct dirent * s = NULL;
22 while ( (s = readdir ( p ))!= NULL )
23 {
24 printf("%s ", s->d_name);
25 }
26 printf("\n");
27 closedir(p);
28 exit(0);
29 }
2.5编译运行
看结果发现,当前文件夹下多了一个 . 和一个 …两个文件,这是以为我们自己写的ls可执行程序也把当前文件夹下的隐藏文件显示出来了。可是我们平时用的ls并没有显示隐藏文件,要想显示隐藏文件,就要加一个参数 -a 即ls -a,so我们改进一下自己的ls,当执行ls可执行文件时,不把隐藏文件显示出来。
2.6改进ls.c
1 #include<stdio.h>
2 #include<unistd.h>
3 #include<string.h>
4 #include<stdlib.h>
5 #include<dirent.h>
6
7 int main()
8 { //获取当前路径
9 char buff[128] = { 0 };
10 if(getcwd(buff,128) == NULL )
11 {
12 return 0;//获取当前路径失败,就直接退出程序
13 }
14
15 DIR * p = opendir(buff);//获取目录流
16 if( p == NULL )
17 {
18 return 0;
19 }
20
21 struct dirent * s = NULL;
22 while ( (s = readdir ( p ))!= NULL )
23 {
24 if (strncmp(s->d_name,".",1) == 0 )
25 {
26 continue;//当文件名第一个字符为 . 时退出本次循环 不打印
27 }
28 printf("%s ", s->d_name);
29 }
30 printf("\n");
31 closedir(p);
32 exit(0);
33
34 }
2.7重新编译运行
隐藏文件已不显示,ls命令实现成功!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/95569.html