APUE 1-3.c列出一个目录中的所有文件

1-3.c程序,必须指出,apue.h 中包含的出错例程(函数)仅用于将信息输出到标准错误;

当程序作为守护进程运行时,需要有另外的出错例程(函数)来处理守护进程可能输出的信息,例如与 syslog 进程通信并记录到日志等,

限于篇幅,这里没有整合相应的源码,有兴趣的童鞋,请参考

《UNIX 环境高级编程(第三版)》一书中,第727页开始的内容



my_LS_command_implement.c  程序的功能很简单,它通过用户在 shell 命令行中指定的绝对路径,来列出该目录下的内容


该程序第7,8行分别定义了 DIR 结构型指针与 dirent 结构型指针,用于指向后面

opendir() 与 readdir() 函数返回的内容;

1
2
     DIR            *dp;
     struct  dirent    *dirp;



第10~11行首先判断,用户输入的 shell 命令行参数个数(命令行参数个数通过 main 函数的第一个参数 argc 传递;命令行参数内容通过 main 函数的第二个参数 argv[] 传递)是否有2个,如果没有2个,则调用作者编写的标准出错例程提醒用户:必须指定要打开的目录;

1
2
     if  (argc != 2)
         err_quit( "usage: ls directory_name" );




第13~14行调用库函数 opendir 打开用户指定的目录,该目录通过 argv[1] 传递给 opendir(),通过将后者返回的值(DIR结构型变量)赋给 dp 并判断:如果 dp 为空指针则说明打开目录失败,此时调用作者编写的标准出错例程提醒用户:无法打开指定的目录;

1
2
     if  ((dp = opendir(argv[1])) == NULL)
         err_sys( "can't open %s" , argv[1]);



第15~16行将指向 opendir() 成功打开的目录( DIR 结构型变量)的指针 dp 作为参数传递并在一个 while 循环中反复调用库函数 readdir ,将后者返回的值(dirent结构型变量)赋给 dirp 指针并判断:如果 readdir() 读取完目录中的所有文件和子目录,此时 dirp 为空指针,退出循环;反之,每当 readdir() 成功读取目录中的一个文件或子目录,就打印该文件或目录的名称(通过访问 dirp 指向的 dirent结构的 d_name 成员,该成员存储名称)

1
2
     while  ((dirp = readdir(dp)) != NULL)
         printf ( "%s\n" , dirp->d_name);



第18行将 dp 指针作为参数传递并调用库函数 closedir,用来关闭 opendir()打开的目录

1
     closedir(dp);



第19行使用标准的退出程序方式:以参数0调用 exit 函数,表示没有错误,正常退出

1
     exit (0);

你可能感兴趣的:(APUE 1-3.c列出一个目录中的所有文件)