Linux自己实现pwd和ls命令

导读:本篇文章讲解 Linux自己实现pwd和ls命令,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

自己实现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

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!