我正在尝试检测Go打开的文件描述,但没有故意关闭。换句话说,我试图使我的代码“错误”,资源泄漏。
我的代码是
func hh(w http.ResponseWriter, r *http.Request) {
f0, err := os.OpenFile("notes.txt", os.O_RDWR|os.O_CREATE, 0755)
if err != nil {
log.Fatal(err)
}
// I don't close file
fmt.Println(io.ReadAll(f0))
}
func main() {
http.HandleFunc("/req", hh)
log.Fatal(http.ListenAndServe(":8080", nil))
}
我使用shell脚本文件打印出有多少文件描述属于这个Go程序。FCOUNT=`lsof -p $1 | grep -v " txt " | wc -l`;echo "PID: $1 $FCOUNT" | sort -nk3
无论我向此服务器发送多少请求(),MacBook上的数字仍然是10。当然,我检查并得到相同的答案。curl http://localhost:8080/reqActivity Monitor
PS:我的第一个版本的代码实际上正在使用,并且没有关闭响应。也有同样的情况。http.GetBody
我的环境: ,macOS Big Sur 11.2.3go version go1.16.2 darwin/amd64
有谁知道为什么文件描述号在我认为应该泄漏时保持静止?我的 shell 脚本有问题吗?还是Golang在里面做了一些技巧?
谢谢!
更新
问题是我正在检查命名的进程而不是我的文件夹名称。Go真的给了我一个额外的程序,看起来像一个守护进程,它不能显示fd细节。真正的程序清楚地显示了fd泄漏。尽管如此,我从关于golang的GC的答案和评论中得到了一些知识。gogo
我将结束这个问题。
郎朗坤
慕虎7371278
相关分类