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