【问题标题】:Go: Why does os.Getwd() sometimes fail with EOFGo:为什么 os.Getwd() 有时会因 EOF 而失败
【发布时间】:2012-11-28 20:44:35
【问题描述】:
package main
import "os"
import "fmt"

func main() {
    _, err := os.Getwd()
    if err != nil {
        fmt.Println(err)
    }
}

这有时会打印 EOF 错误。有谁知道为什么?之前通常会发生一些 os.Chdir ,但这不会出错。

GOARCH="amd64"
GOBIN=""
GOCHAR="6"
GOEXE=""
GOGCCFLAGS="-g -O2 -fPIC -m64 -pthread -fno-common"
GOHOSTARCH="amd64"
GOHOSTOS="darwin"
GOOS="darwin"

go version go1.0.3

【问题讨论】:

  • 请添加 Go 版本/操作系统平台/CPU 架构信息,如果可能的话,添加一个最小的程序来重现。
  • 只是猜测,因为我从来没有遇到过这种情况。但是,chdir 是否有可能移动到权限不正确的目录,因此尝试获取当前目录会因为不可读而失败?
  • 你能重复测试吗?这次不是正常打印错误,而是使用fmt.Printf("%v | %T | %#v\n", err, err, err)
  • os.Getwd() 返回 string, error 所以示例无法编译:golang.org/pkg/os/#Getwd
  • 我的猜测是它是相当可怕的 getwd 代码中的一个错误:golang.org/src/pkg/os/getwd.go 从我的 grepping 中 OSX 没有将 getwd 实现为系统调用,因此它使用上面的后备实现。我没有mac,否则我会去调试它!唯一可以返回 EOF 的地方是来自 fd.Readdirnames(100),这可能意味着当前目录已被删除或发生了其他奇怪的事情。

标签: go


【解决方案1】:

这是os.Getwd 中的一个错误,在不支持getwd 系统调用的平台上,当工作目录不再存在时,它会返回EOF 作为错误。这是一个在 OS X 上可重复的测试用例。

package main
import "os"
import "fmt"

const DIR = "/tmp/somedir"

func main() {
    os.Remove(DIR)
    if err := os.Mkdir(DIR, 0755); err != nil {
      fmt.Println(err)
      return
    }
    if err := os.Chdir(DIR); err != nil {
      fmt.Println(err)
      return
    }
    if err := os.Remove(DIR); err != nil {
      fmt.Println(err)
      return
    }
    wd, err := os.Getwd()
    fmt.Println("err:", err)
    fmt.Println("wd:", wd)
}

输出:

err: EOF
wd: 

【讨论】:

    猜你喜欢
    • 2013-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-13
    • 2011-04-30
    • 2020-10-14
    • 1970-01-01
    相关资源
    最近更新 更多