加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

linux – 在写操作后获取errno

发布时间:2020-12-14 02:03:27 所属栏目:Linux 来源:网络整理
导读:我有以下Go代码,它最终将填满磁盘并且使用ENOSPC失败(仅仅是一个概念验证).如何从os.Write返回的错误中确定它确实因ENOSPC而失败(所以我需要一种方法在写入操作后获取errno)? package mainimport ( "log" "os")func main() { fd,_ := os.Create("dump.txt")
我有以下Go代码,它最终将填满磁盘并且使用ENOSPC失败(仅仅是一个概念验证).如何从os.Write返回的错误中确定它确实因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,err := fd.Write(buf)
        if err != nil {

            log.Printf("%T %vn",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;将错误转换为os.PathError并使用Err字段检查根本原因,如下所示:

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读