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); |

本文介绍了一个简单的C程序,该程序模拟了Unix/Linux系统中的ls命令功能,通过用户指定的目录路径,列出该目录下的所有文件及子目录。

被折叠的 条评论
为什么被折叠?



