如何确定某些libc函数的退出状态?

时间:2017-03-14 01:04:34

标签: c function libc

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

2 个答案:

答案 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。

您可以在上述链接的示例中找到此技巧。