Unix/Linux系统编程指南 ls函数的实现

这篇博客探讨了Unix/Linux系统中实现`ls`功能的编程方法,从基础概念如目录结构、dirent结构体到核心的`do_ls`函数和主函数的流程。通过分析`ls`函数所需的参数,解释了如何打开、读取并关闭目录,以展示目录内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基础:

目录(directory)是文件的列表,目录里面有很多记录(dirent),记录可以是文件/子目录
readdir函数可以读取目录中的记录,并且返回指向目录当前记录的指针
记录(dirent)的结构体定义如下
在这里插入图片描述在这里插入图片描述

  • 系统在某个不为人知的地方define了DIR为 directory
  • readdir , closedir 函数都传入directory的指针
  • 目录不会为空,至少有自己,所以当ac(接受的目录的大小)为1的时候,我们需要显示出自己
首先我们来想想这个是怎么实现的
  • 打开一个directory
  • 一直读它,边读边输出,直到读完为止
  • 关闭directory

伪代码:

main()
	opendir
	while ( readdir )
		print d_name
	closedir
分析一下需要传入的参数
  • int ac : dir中的记录的个数
  • char * av[] 各个记录

do_ls 函数

//之前在系统不知道什么地方define了DIR为 dirrect
void do_ls(char dirname[]){
	DIR *dir_ptr;
	struct dirent * direntp; //dirent -pointer
	// read dirptr failed
	if( (dir_ptr = opendir ( dirname) ) == NULL) 
		fprintf( ( stderr , " ls1 : cannot open %s\n" dirname);
	else {
		while ( ( direntp = read( readdir ( dir_ptr )) != NULL )
				printf("%s \n" ,direntp -> d_name);
		closedir(dir_ptr);
	}
} 

主函数

main(int ac, char * av[]){
if( ac ==1 )
          do_ls(".");  
else
  while( --ac ){
	  printf("%s :\n" ,* ++av);
      do_ls(*av);
   }
 }

源代码:

  1 #include <stdio.h>
  2 #include <sys/types.h>
  3 #include <dirent.h>
  4 
  5 void do_ls(char[]);
  6 
  7 main(int ac, char * av[]){
  8     if( ac ==1 )
  9         do_ls(".");
 10     else
 11       while( --ac ){
 12           printf("%s :\n" ,* ++av);
 13           do_ls(*av);
 14       }
 15 }
 16 
 17 /*lisr files in directory called dirname*/
 18 void do_ls(char dirname[]){
 19         DIR *dir_ptr;
 20         struct dirent * direntp; //dirent -pointer
 21         // read dirptr failed
 22         if( (dir_ptr = opendir ( dirname) ) == NULL)
 23             fprintf ( stderr , " ls1 : cannot open %s\n", dirname);
 24         else {
 25             while ( direntp = read( readdir ( dir_ptr )) != NULL )
 26                 printf("%s \n" ,direntp -> d_name);
 27             closedir(dir_ptr);
 28         }
 29 }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值