c实现shell的ls功能

文件名称: ls.c

//
//  ls.c
//  TestC
//
//  Created by TangPing on 2017/12/23.
//  Copyright © 2017年 TangPing. All rights reserved.
//

#include <stdio.h>
#include <stdlib.h>
#include <dirent.h>

int main(int argc, char *argv[]){
    DIR *dp;
    struct dirent *dirp;
   
    if(argc != 2){
        exit(0);
    }
    if((dp = opendir(argv[1])) == NULL){
        exit(0);
    }
    while ((dirp = readdir(dp)) != NULL) {
        printf("%s\n", dirp->d_name);
    }
    closedir(dp);
    exit(0);
}

用以下命令对其编译,编译结果默认在当前目录下,默认名称为a.out的可执行文件

cc ls.c

执行命令:

./a.out /Application

延伸:

DIR结构体定义:

struct __dirstream  
   {  
    void *__fd;    
    char *__data;    
    int __entry_data;    
    char *__ptr;    
    int __entry_ptr;    
    size_t __allocation;    
    size_t __size;    
    __libc_lock_define (, __lock)    
   };  
 
typedef struct __dirstream 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字符 */  
}

以下几个函数用于保存当前读取目录的有关信息:

struct dirent *readdir(DIR *dp);  
 
void rewinddir(DIR *dp);  
 
int closedir(DIR *dp);  
 
long telldir(DIR *dp);  
 
void seekdir(DIR *dp,long loc);

如果想实现ls -l同样的功能,可用以下结构体进行扩展:

struct stat {  
 
        mode_t     st_mode;       //文件访问权限  
 
        ino_t      st_ino;       //索引节点号  
 
        dev_t      st_dev;        //文件使用的设备号  
 
        dev_t      st_rdev;       //设备文件的设备号  
 
        nlink_t    st_nlink;      //文件的硬连接数  
 
        uid_t      st_uid;        //所有者用户识别号  
 
        gid_t      st_gid;        //组识别号  
 
        off_t      st_size;       //以字节为单位的文件容量  
 
        time_t     st_atime;      //最后一次访问该文件的时间  
 
        time_t     st_mtime;      //最后一次修改该文件的时间  
 
        time_t     st_ctime;      //最后一次改变该文件状态的时间  
 
        blksize_t st_blksize;    //包含该文件的磁盘块的大小  
 
        blkcnt_t   st_blocks;     //该文件所占的磁盘块  
 
      };

Leave a Comment