最新消息:yaf表单扩展中新增加了浮点数、日期和集合的校验。php yaf框架扩展实践三——表单

golang文件黑洞WriteAt设置offset参数无效的问题

Golang 1327浏览 0评论

在用golang做文件黑洞测试的时候,需要用file.WriteAt函数,并设置相应的offset参数,但是执行程序的时候发现在linux下执行没有效果,在mac下有效。

代码如下

package main

import (
    "flag"
    "fmt"
    "os"
)

func main() {
    offs := flag.Int64("offs", 0, "offs")
    flag.Parse()

    fmt.Println(*offs)

    file, err := os.OpenFile("hole", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0600)
    defer file.Close()

    b := []byte{1}
    n, err := file.WriteAt(b, *offs)

    fmt.Println(n, err)
    // output: 1 <nil>
}

在mac上执行

$ go run main.go --offs=10

查看生成的文件内容

$ hexdump hole
0000000 00 00 00 00 00 00 00 00 00 00 01               
000000b

可以看到offset的设置可以生效。

在linux上执行

$ go run main.go --offs=10

查看生成的文件内容

$ hexdump hole
0000000 0001                                   
0000001

从结果上来offset的设置并没有生效,只是在第一个字进行了写入。
再次执行查看文件:

$ ./holelinux --offs=10
10
1 

$ hexdump hole
0000000 0101                                   
0000002

只在第二个字节写入。
多次执行该程序后,发现只是依次在第三、第四…字节进行写入。

于是猜测和打开文件指定os.O_APPEND,追加这个属性有关系,去除掉代码里的os.O_APPEND,再次测试就可以达到预期效果了。

小结

不知道这个算不算是golang的bug,因为在mac下和linux下,同样的代码执行并不一致。

转载请注明:快乐编程 » golang文件黑洞WriteAt设置offset参数无效的问题

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址