zl程序教程

您现在的位置是:首页 >  系统

当前栏目

Linux自己实现pwd和ls命令

Linux命令 实现 自己 ls pwd
2023-09-11 14:22:56 时间

自己实现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命令实现成功!