首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Golang中的打开文件错误太多

Golang中的打开文件错误太多
EN

Stack Overflow用户
提问于 2016-06-14 14:47:17
回答 3查看 21.2K关注 0票数 8

我只是在读取/proc/diskstats文件。我的代码是:

代码语言:javascript
复制
func ReadFromFile(filepath string)(string){
    defer func() {
        if err1 := recover(); err1 != nil {
            fmt.Println("!!!!!!!!!!!!!!!!Panic Occured and Recovered in readFromFile(), Error Info: ", err1)
        }
     }()

    strData := ""

    data, err := ioutil.ReadFile(filepath)
    if err != nil{
        fmt.Println("File read error: ", err)
        return ""
    }

    strData = string(data)
    return strData
}

我得到的错误是:

代码语言:javascript
复制
File read error: open /proc/diskstats: too many open files

不仅对于这个文件,我也在其他一些文件中得到了相同的错误。

我还运行了这个命令:

代码语言:javascript
复制
root@golang:~# lsof|wc -l

785

请给我引路。

EN

回答 3

Stack Overflow用户

发布于 2017-08-04 15:47:37

我遇到了同样的问题(可能是不同的环境或设置),并以不同的方式修复了它:

代码语言:javascript
复制
func some_func(file_name []string) {
    for _, file_name := range file_names {
        f, _ := os.Create(file_name)
        // defer f.Close() // bad idea
        _, _ = f.Write([]byte("some text"))
        f.Close() // better idea
    }
}

问题是,当函数返回时,defer将被执行,这可能需要一段时间-取决于循环的大小(坏主意)。所以只需要明确地做(更好的想法)

票数 13
EN

Stack Overflow用户

发布于 2016-06-14 16:08:23

基本上,在UNIX平台中,操作系统对进程在任何给定时间可能具有的打开文件描述符的数量进行了限制。

由于您已达到当前打开的文件(和或管道或套接字)的限制,并且您正在尝试打开新文件(和或管道或套接字),因此会引发错误too many open files

要避免此问题,必须在完成使用Close()函数打开的文件时关闭该文件

票数 7
EN

Stack Overflow用户

发布于 2019-11-16 07:00:49

OP不提供Minimal, Reproducible Example。有问题的错误是由未发布的代码引起的。演示这一点的一种简单方法是在一个最小的示例中运行所提供的代码(没有其他活动),并确保它不会失败。

当然,函数ioutil.ReadFile会关闭该文件。在这种情况下,它之所以受到牵连,只是因为它试图在已经达到资源限制时打开一个新文件。

Go中一个常见的陷阱是无法关闭隐式打开的流。这种情况的一个具体情况是,在使用http库的客户端函数时打开一个流。

示例:(1)(2)

完成后,客户端必须关闭响应正文:

代码语言:javascript
复制
resp, err := http.Get("http://example.com/")
if err != nil {
    // handle error
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)

这样的请求应该始终包括使用如上所示的表单调用 Close,。

可能还有其他类似的隐式流被打开的情况...

这是一个特别棘手的问题,因为对于琐碎的程序,您永远不会知道其中的区别。你不会知道有问题,直到你运行了数百次,甚至数千次迭代。然后,错误通常可能表现为一些不相关的函数调用失败--就像OP所演示的那样。

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

https://stackoverflow.com/questions/37804804

复制
相关文章

相似问题

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