Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 写入操作后获取errno_Linux_Go - Fatal编程技术网

Linux 写入操作后获取errno

Linux 写入操作后获取errno,linux,go,Linux,Go,我有下面的Go代码,它最终会填满磁盘,并以ENOSPC失败(只是一个概念证明)。如何从os.Write返回的err确定它确实是因为ENOSPC而失败的(因此我需要一种方法在写入操作后获取errno) 编辑:将程序更新为@fuzzxl建议: package main import ( "log" "os" "syscall" ) func main() { fd, _ := os.Create("dump.txt") defer fd.Close()

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

编辑:将程序更新为@fuzzxl建议:

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

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

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

实际上,我认为这会起作用,但似乎
err
无法转换为
syscall.Errno
:(请参阅我更新的问题。@未知,这很奇怪。您能告诉我
fmt.Printf(“%t”,err)是什么吗
说明?您在哪个平台上?您可以在上面的输出中看到,
err
是一个
*os.PathError
。我使用的是Linux amd64。它可以工作,但请在我接受您的回答之前完全更新您的示例(即,将err转换为
os.PathError
并使用
errno.err
),以便在其他人需要时正确。
patherr, ok := err.(*os.PathError)
if ok && patherr.Err == syscall.ENOSPC {
    log.Println("Out of disk space!")
}