首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么fstream零errno在析构函数中

为什么fstream零errno在析构函数中
EN

Stack Overflow用户
提问于 2016-12-13 06:53:42
回答 1查看 128关注 0票数 0

示例代码如下所示:

代码语言:javascript
复制
void testFuncErrno()
{
    fstream fstr;
    fstr.exceptions(std::ifstream::failbit | std::ifstream::badbit);
    try
    {
        fstr.open("/mnt/virtualfs/test.ss", ofstream::out);
        fstr << "test" << endl;
    }
    catch(std::ifstream::failure e)
    {
        cout << "func catch errno is:" << errno << ":" << strerror(errno) << endl;
        cout << "good?" << (fstr.good()?"yes":"no") << endl;
    }
}

int main(int argc, char *argv[])
{
    try
    {
        errno = 0;
        testFuncErrno();
        cout << "0 st errno is:" << errno << ":" << strerror(errno) << endl;
    }
    catch(std::ifstream::failure e)
    {
        cout << "catch errno is:" << errno << ":" << strerror(errno) << endl;
    }
    pause();
    return 0;
}

当磁盘已满时,我想要捕获errno,但当函数结束时,errno似乎将被设置为零。我使用ddd跟踪源代码,并发现了如下注释,但来自errno描述:

在程序启动时,errno设置为零,标准C库的任何函数都可以将其值修改为与零不同的值,通常用于向特定类别的错误发出信号(一旦更改,没有库函数将其值设置为零)。

这让我有点困惑,为什么关闭会将errno设置为零?

代码语言:javascript
复制
  __basic_file<char>* 
  __basic_file<char>::close()
  { 
    __basic_file* __ret = static_cast<__basic_file*>(NULL);
    if (this->is_open())
      {
    int __err = 0;
    if (_M_cfile_created)
      {
        **// In general, no need to zero errno in advance if checking
        // for error first. However, C89/C99 (at variance with IEEE
        // 1003.1, f.i.) do not mandate that fclose must set errno
        // upon error.**
        errno = 0;
        do
          __err = fclose(_M_cfile);
        while (__err && errno == EINTR);
      }
    _M_cfile = 0;
    if (!__err)
      __ret = this;
      }
    return __ret;
  }
EN

回答 1

Stack Overflow用户

发布于 2016-12-13 07:19:46

在调用已知设置errno的库函数之前将errno设置为零是一个很好的做法,只有在函数返回指示失败的值后才检查errno。这是因为无论是否存在错误,C标准库函数调用都可以将errno的值设置为非零,条件是在函数的说明中没有记录对errno的使用。

因此,如果只在程序开始时初始化errno,则无法保证错误值是由哪个函数调用设置的。

在调用fclose()之前将错误设置为0,可以确认errno所具有的值是由fclose()设置的,而没有其他函数设置。

您可以在下面讨论使用:https://www.securecoding.cert.org/confluence/pages/viewpage.action?pageId=6619179

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41115202

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档