去ioutil.ReadFile()中的错误

gee*_*eek 4 go

我在Go中运行一个程序,它在读取文件后不断发送数据/proc/stat.使用ioutil.ReadFile("/proc/stat") After运行约14小时后,我得到了错误:too many files open /proc/stat 点击此处获取代码片段.

我怀疑f.CloseGo有时会忽略defer ,或者它正在跳过它.


代码片段(如果play.golang.org比stackoverflow.com更早死亡):

package main

import ("fmt";"io/ioutil")

func main() {
    for {
        fmt.Println("Hello, playground")
        fData,err := ioutil.ReadFile("/proc/stat")
        if err != nil {
            fmt.Println("Err is ",err)
        }   
        fmt.Println("FileData",string(fData))
    }
}
Run Code Online (Sandbox Code Playgroud)

小智 5

原因可能是你的程序中的某个地方:

  • 你忘了关闭文件了,或者

  • 你依靠垃圾收集器来自动关闭对象终结的文件,但是Go的保守垃圾收集器没有这样做.在这种情况下,您应该检查程序的内存消耗(在程序运行时是否稳定增加).

在任何一种情况下,尝试检查内容,/proc/PID/fd以查看程序运行时打开文件的数量是否在增加.