Go:为什么 os.Getwd() 有时会失败并返回 EOF?

4
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

2
请添加Go版本/操作系统平台/CPU架构信息,如果可能的话,请提供一个最小化程序以便复现。 - zzzz
4
我猜测,因为我从未遇到过这种情况。但是是否有可能chdir转移到了一个权限不正确的目录,因此尝试获取当前目录会失败并显示为不可读? - Jeremy Wall
你能重复一下测试吗?这次不要正常打印错误,而是使用 fmt.Printf("%v | %T | %#v\n", err, err, err) - Stephen Weinberg
1
os.Getwd() 返回 string, error,所以示例无法编译:http://golang.org/pkg/os/#Getwd - Nick Craig-Wood
3
我猜测这是一个相当丑陋的getwd代码中的错误:http://golang.org/src/pkg/os/getwd.go。从我的搜索来看,OSX没有实现getwd作为系统调用,因此使用了上面的后备实现。我没有苹果电脑,否则我会尝试调试它!EOF可能仅会从“fd.Readdirnames(100)”返回,这可能意味着当前目录已被删除或其他一些奇怪的情况发生。 - Nick Craig-Wood
1个回答

2

这是一个与 os.Getwd 相关的 bug,当工作目录在不支持 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: 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接