Linux中ls命令的实现


ls命令是Linux下最常用的命令之一,ls跟dos下的dir命令是一样的都是用来列出目录下的文件,下面我们就来一起看看ls的实现方法。

Linux下ls命令的实现 

ls 命令:15个Linux面试级问题--第一集 

ls 命令:十条面试级问题--第二集 

#include <dirent.h>
是POSIX.1标准定义的unix类目录操作的头文件,包含了许多UNIX系统服务的函数原型,例如opendir函数、readdir函数.

opendir函数:

DIR *opendir(const char *pathname);返回值:若成功则返回指针,若出错则返回NULL。
struct dirent *readdir(DIR *dp); 返回值:若成功则返回指针,若在目录结尾或出错则返回NULL。

ls的简要实现:

写makefile

运行测试:

--------------------------------------分割线 --------------------------------------

见下面程序: 

#include <sys/types.h>
#include <dirent.h>
#include <stdio.h>

int main( int argc, int *argv[] )
{
    DIR                *dir;
    struct dirent    *dirp;
   
    if ( argc != 2 )
    {
        printf( "usage: %s directory_name \n", argv[0] );
        return -1;
    }
   
    if ( !(dir=opendir(argv[1])) )
    {
        printf( "can not open %s\n", argv[1] );
        return -1;
    }
   
    while ( (dirp=readdir(dir)) != NULL )
    {
        printf( "%s\n", dirp->d_name );
    }
   
    closedir( dir );
   
    return 0;
}

 


对其中的几个重要结构体和函数解说一下。

opendir
opendir()用来打开参数 name 指定的目录,并返回 DIR* 形态的
目录流,和 open()类似,接下来对目录的读取和搜索都要使用此返回值,
成功则返回 DIR* 型态的目录流,打开失败则返回 NULL

readdir()返回参数 dir 目录流的下个目录进入点。    结构 dirent 定义
如下:
struct dirent
{
    long d_ino;                /* inode number */索引节点号
    off_t d_off;                /* offset to this dirent */在目录文件中的偏移
    unsigned short d_reclen;    /* length of this d_name */文件名长
    unsigned char d_type;        /* the type of d_name */文件类型   
    char d_name [NAME_MAX+1];  /* file name (null-terminated) */文件名,最长255字符
}

成功则返回下个目录进入点。有错误发生或读取到目录文件尾则返回 NULL。

本文永久更新链接地址

相关内容