在用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参数无效的问题