linux - 写操作后获取errno

标签 linux go

我有以下 Go 代码,它最终会填满磁盘并以 ENOSPC 失败(只是概念证明)。我如何从 os.Write 返回的 err 中确定它确实因为 ENOSPC 而失败(所以我需要一种方法来获取 errno 写操作后) ?

package main

import (
    "log"
    "os"
)

func main() {
    fd, _ := os.Create("dump.txt")

    defer fd.Close()

    for {
        buf := make([]byte, 1024)

        _, err := fd.Write(buf)
        if err != nil {
            log.Fatalf("%T %v", err, err)
        }
    }
}

编辑:按照@FUZxxl 的建议更新程序:

package main

import (
    "log"
    "os"
    "syscall"
)

func main() {
    fd, _ := os.Create("dump.txt")

    defer fd.Close()

    for {
        buf := make([]byte, 1024)

        _, err := fd.Write(buf)
        if err != nil {

            log.Printf("%T %v\n", err, err)
            errno, ok := err.(syscall.Errno)

            if ok {
                log.Println("type assert ok")
                if errno == syscall.ENOSPC {
                    log.Println("got ENOSPC")
                }
            } else {
                log.Println("type assert not ok")
            }
            break
        }
    }
}

但是,我没有得到预期的结果。这是输出:

2015/02/15 10:13:27 *os.PathError write dump.txt: no space left on device
2015/02/15 10:13:27 type assert not ok

最佳答案

文件操作通常返回 *os.PathError ;将 err 转换为 os.PathError 并使用 Err 字段检查根本原因,如下所示:

patherr, ok := err.(*os.PathError)
if ok && patherr.Err == syscall.ENOSPC {
    log.Println("Out of disk space!")
}

关于linux - 写操作后获取errno,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28519245/

相关文章:

c++ - 使用(希望是标准的)C++ 工具读取 FILE*?

linux - 使用 GetOpts 和强制参数验证命令行参数

linux - 用户如何设置可从子 shell 访问的环境变量?

ruby-on-rails - Debian 添加用户

go - 找不到 Go 包

linux - Qemu套接字通信

git - 我正在尝试安装 Go lang 包,但它给出了这样的错误::错误:以下未跟踪的工作树文件将被 merge 覆盖

string - 如何从 Go 中的字符串中替换第 n 个字符

elasticsearch - filebeat 如何检查文件中的新内容?

Emacs 在 go-mode 下找不到 gofmt