Go:为什么os.Getwd()有时会因EOF而失败

Go:为什么os.Getwd()有时会因EOF而失败,go,Go,这有时会打印一个EOF错误。有人知道为什么吗?以前通常会发生一些os.Chdir,但这不会出错 package main import "os" import "fmt" func main() { _, err := os.Getwd() if err != nil { fmt.Println(err) } } 这是os.Getwd中的一个bug,在不支持Getwdsyscall的平台上,当工作目录不再存在时,它会将EOF作为错误返回。这里是OSX上

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

package main
import "os"
import "fmt"

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

这是
os.Getwd
中的一个bug,在不支持
Getwd
syscall的平台上,当工作目录不再存在时,它会将EOF作为错误返回。这里是OSX上的一个可重复测试用例

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
输出:

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)
}

请添加Go版本/OS平台/CPU架构信息,如果可能的话,再添加一个最小的复制程序。只是一个猜测,因为我从来没有遇到过这种情况。但是,有没有可能chdir移动到了一个权限不可靠的目录,因此尝试获取当前目录失败,因为无法读取?您可以重复测试吗?这次不是正常打印错误,而是使用
fmt.Printf(“%v |%T |%v\n”,err,err,err)
os.Getwd()
返回
string,错误
因此示例未编译:我猜这是相当可怕的getwd代码中的一个bug:从我的grepping中,OSX没有将getwd实现为系统调用,因此它使用上面的回退实现。我没有mac,否则我会尝试调试它!EOF只能从
fd.Readdirnames(100)
返回,这可能意味着当前目录已被删除或发生了其他异常情况。
err: EOF
wd: