1)在libc中有某些函数只返回 退出状态 - 成功状态和错误状态。
2)还有其他函数返回可用值。怎么做 他们将退出状态告知用户? 有两种选择:
2.1)返回未使用的值以表示成功状态 和另一个未使用的返回值来表示该错误 发生了,其状态必须在“errno”变量中查找。
2.2)仅返回一个未使用 值,表示用户必须查看退出状态 在“errno”变量中。
在子案例2.2)中存在问题:未设置成功状态 在“errno”变量中,只有错误状态。
也许我错过了一些明显的东西,但我不清楚 必须使用哪种逻辑来合理地使用这些功能。
例如,readdir()
或getwchar()
。
以下是一个例子:
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <dirent.h>
int main(void)
{
DIR *dp;
struct dirent *ep;
if ((dp = opendir("/tmp/")) == NULL) {
fprintf(stderr, "opendir: %s\n", strerror(errno));
exit(-1);
}
errno = EINVAL; /* suppose some function exited with error earlier */
while ((ep = readdir(dp)) != NULL) {
if (strcmp(ep->d_name, ".") == 0
|| strcmp(ep->d_name, "..") == 0)
continue;
printf("%s\n",ep->d_name);
}
if (errno != 0) {
fprintf(stderr, "readdir: %s\n", strerror(errno));
closedir(dp);
exit(-1);
}
closedir(dp);
return 0;
}
输出:
...
readdir: Invalid argument
答案 0 :(得分:2)
您遇到的问题是readdir()
规范中的一个漏洞。在目录列表的末尾返回NULL并在出错时返回NULL之间没有区别:
readdir()
函数返回指向下一个目录条目的指针。它 到达目录末尾或出错时返回NULL。在里面 如果出现错误,可以将errno
设置为记录的任何值getdirentries(2)
系统调用。
在实践中,可以安全地假设readdir()
永远不会返回错误,并且NULL返回值始终意味着您已到达目录的末尾。很少有实际情况会导致opendir()
成功但后续readdir()
失败,而且大多数此类情况无论如何都是不可恢复的。 (最可能的原因是存储设备突然发生故障。)
答案 1 :(得分:2)
正如您可以阅读readdir
的POSIX规范
http://pubs.opengroup.org/onlinepubs/009695399/functions/readdir_r.html
遇到错误时,应返回空指针 应设置 errno 以指示错误。当结束了 遇到目录时,应返回空指针并且 errno 没有改变。
你应该这样做
errno = 0;
每次致电readdir
之前。然后,您可以确定是否发生了错误(并且 errno 已正确设置),或者目录的结尾自然返回null。
您可以在上述链接的示例中找到此技巧。