【发布时间】:2018-03-17 19:26:59
【问题描述】:
我已经编写并运行了以下代码:
#define _XOPEN_SOURCE
#include <iostream>
#include <unistd.h>
int main()
{
std::cout << "errno = " << errno << std::endl;
std::cout << crypt("sometext", "ab") << std::endl;
std::cout << "errno = " << errno <<std:: endl;
return 0;
}
errno 的初始值为0,但在调用crypt() 函数后,它被设置为2 (ENOENT)。
这是输出:
errno = 0
abtAunjzvWWRQ
errno = 2
【问题讨论】:
-
crypt 库可能试图在途中打开某种资源文件,但失败了,但 crypt 库不认为这是一个问题。 (也许它有一个 B 计划。)另请参阅 question 12.24 中的 C FAQ list。
-
crypt的手册页没有提到任何关于设置errno的内容,它只是说成功时,返回指向加密密码的指针。出错时,返回 NULL。。在您的情况下,它不会返回NULL,因此函数成功结束。errno必须设置在crypt内部的某个位置,并且函数知道如何处理错误(请注意,函数不必手动将errno设置为 0)。 -
这很常见,这就是为什么将
errno设置为0、调用函数然后检查errno是不推荐的事情。通常只有在库函数通过其返回值指示它失败后检查errno才有意义——并且只有当它是一个记录为设置errno的库函数时才有意义。 -
虽然不是这种情况的根本原因,但
cout语句中发生的任何流操作都可以轻松更改errno的值...... -
这里没有证据表明
crypt()做到了,因为它与流 I/O 交错;并且没有任何理由不应该打扰errno。仅在前一个系统调用返回 -1 时检查它才有效。