Linux自己实现pwd和ls命令
自己实现pwd和ls命令
文章目录
在我们的mybash版本1.0和mybash版本2.0中,通过执行程序fork一个子进程,然后再替换子进程实现了/usr/bin/目录下的命令操作,详情请看 写一个自己的bash1.0版本, 写一个自己的bash2.0版本,execvp会自动在路径下寻找到命令,我们通过echo查看一下路径
![在这里插入图片描述](https://img-blog.csdnimg.cn/85441e5e34074b53ac35f1bed5953827.png)
所以功能并不是我们自己实现的,现在我们就尝试着自己写一下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命令实现成功!
相关文章
- [Linux] linux awk命令详解
- Linux系统中‘dmesg’命令处理故障和收集系统信息的7种用法
- 修改Linux命令:ls为例
- Linux之nohup命令:实现退出终端后程序继续后台运行
- 修改Linux命令:ls为例
- Linux - history命令的常用方法
- Linux下获取详细硬件信息的工具:Dmidecode命令详解
- Linux xshell窗口批量命令编辑功能(发送键输入到所有窗口)
- [手游新项目历程]-30- linux svn-client
- Linux linux echo命令的-n、-e两个参数
- linux学习之八---Linux进程基础知识
- L84.linux命令每日一练 -- 第11章 Linux系统管理命令 -- rpm和yum
- L72.linux命令每日一练 -- 第十章 Linux网络管理命令 -- mail和nslookup
- L59.linux命令每日一练 -- 第九章 Linux进程管理命令 -- killall和pkill
- L50.linux命令每日一练 -- 第八章 Linux磁盘与文件系统管理命令 -- tune2fs和parted
- L48.linux命令每日一练 -- 第七章 Linux用户管理及用户信息查询命令 -- last、lastb和lastlog
- L43.linux命令每日一练 -- 第七章 Linux用户管理及用户信息查询命令 -- chage和chpasswd
- L31.linux命令每日一练 -- 第五章 Linux信息显示与搜索文件命令 -- uname和hostname
- L30.linux命令每日一练 -- 第四章 文本处理三剑客 -- awk命令
- linux命令之内存信息查询
- 【Linux】linux经常使用基本命令
- linux达人养成计划学习笔记(四)—— 压缩命令
- Linux命令篇-Finger命令查找用户详细信息
- Linux常用命令— 目录和文件都能操作的命令