如何确定某些 libc 函数的退出状态?
How to determine exit status of certain libc functions?
1) 在 libc 中有某些函数 return
退出状态 - 成功状态和错误状态(es)。
2) 还有其他函数return一个可用的值。怎么做
他们将退出状态传达给用户?
有两种选择:
2.1) return 未使用值来表示成功状态
和另一个未使用的 return 值来表示该错误
发生了,必须在 "errno" 变量中查看它的状态。
2.2) return 仅 一个 未使用
向用户发出必须查看退出状态信号的值
在 "errno" 变量中。
在子案例2.2)中存在问题:未设置成功状态
在 "errno" 变量中,只有错误状态(es)。
也许我遗漏了一些明显的东西,但我不清楚
必须用什么逻辑才能理智的使用这些功能
例如,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
您 运行 的内容在 readdir()
的规范中有点漏洞。在目录列表末尾 returning NULL 和在错误时 returning NULL 之间没有区别:
The readdir()
function returns a pointer to the next directory entry. It
returns NULL upon reaching the end of the directory or on error. In the
event of an error, errno
may be set to any of the values documented for
the getdirentries(2)
system call.
实际上,可以安全地假设 readdir()
永远不会 return 是一个错误,并且 NULL return 值总是意味着您已经到达目录的末尾。很少有实际情况会导致 opendir()
成功但随后 readdir()
失败,而且大多数此类情况无论如何都是不可恢复的。 (最有可能的原因是存储设备突然出现故障。)
您可以从 readdir
的 POSIX 规范中读到
http://pubs.opengroup.org/onlinepubs/009695399/functions/readdir_r.html
When an error is encountered, a null pointer shall be returned and
errno shall be set to indicate the error. When the end of the
directory is encountered, a null pointer shall be returned and errno
is not changed.
你应该这样做
errno = 0;
在每次调用 readdir
之前。然后你可以确定是否发生了错误(并且 errno 被适当地设置)或者它自然地返回 null for end of directory.
你可以在上面的例子中找到这个技巧link。
1) 在 libc 中有某些函数 return 退出状态 - 成功状态和错误状态(es)。
2) 还有其他函数return一个可用的值。怎么做 他们将退出状态传达给用户? 有两种选择:
2.1) return 未使用值来表示成功状态 和另一个未使用的 return 值来表示该错误 发生了,必须在 "errno" 变量中查看它的状态。
2.2) return 仅 一个 未使用 向用户发出必须查看退出状态信号的值 在 "errno" 变量中。
在子案例2.2)中存在问题:未设置成功状态 在 "errno" 变量中,只有错误状态(es)。
也许我遗漏了一些明显的东西,但我不清楚 必须用什么逻辑才能理智的使用这些功能
例如,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
您 运行 的内容在 readdir()
的规范中有点漏洞。在目录列表末尾 returning NULL 和在错误时 returning NULL 之间没有区别:
The
readdir()
function returns a pointer to the next directory entry. It returns NULL upon reaching the end of the directory or on error. In the event of an error,errno
may be set to any of the values documented for thegetdirentries(2)
system call.
实际上,可以安全地假设 readdir()
永远不会 return 是一个错误,并且 NULL return 值总是意味着您已经到达目录的末尾。很少有实际情况会导致 opendir()
成功但随后 readdir()
失败,而且大多数此类情况无论如何都是不可恢复的。 (最有可能的原因是存储设备突然出现故障。)
您可以从 readdir
的 POSIX 规范中读到
http://pubs.opengroup.org/onlinepubs/009695399/functions/readdir_r.html
When an error is encountered, a null pointer shall be returned and errno shall be set to indicate the error. When the end of the directory is encountered, a null pointer shall be returned and errno is not changed.
你应该这样做
errno = 0;
在每次调用 readdir
之前。然后你可以确定是否发生了错误(并且 errno 被适当地设置)或者它自然地返回 null for end of directory.
你可以在上面的例子中找到这个技巧link。