linux禁用系统缓存,linux – 在Golang中读取文件时如何跳过文件系统缓存?

假设文件Foo.txt的内容如下.

Foo Bar Bar Foo

考虑以下简短程序.

package main

import "syscall"

import "fmt"

func main() {

fd,err := syscall.Open("Foo.txt",syscall.O_RDONLY,0)

if err != nil {

fmt.Println("Failed on open: ",err)

}

data := make([]byte,100)

_,err = syscall.Read(fd,data)

if err != nil {

fmt.Println("Failed on read: ",err)

}

syscall.Close(fd)

}

当我们运行上面的程序时,我们没有错误,这是正确的行为.

现在,我将syscall.Open行修改为以下内容.

fd,syscall.O_RDONLY | syscall.O_SYNC | syscall.O_DIRECT,0)

当我再次运行程序时,我得到以下(不合需要的)输出.

Failed on read: invalid argument

如何正确传递open man page指定的标志syscall.O_SYNC和syscall.O_DIRECT以跳过文件系统缓存?

请注意,我直接使用syscall文件接口而不是os文件接口,因为我找不到将这些标志传递给os提供的函数的方法,但我对使用os的解决方案持开放态度,前提是它们正常​​工作以禁用读取时的文件系统缓存.

另请注意,我在Ubuntu 14.04上运行,ext4作为我的文件系统.

更新:我尝试在下面的代码中使用@Nick Craig-Wood的软件包.

package main

import "io"

import "github.com/ncw/directio"

import "os"

import "fmt"

func main() {

in,err := directio.OpenFile("Foo.txt",os.O_RDONLY,0666)

if err != nil {

fmt.Println("Error on open: ",err)

}

block := directio.AlignedBlock(directio.BlockSize)

_,err = io.ReadFull(in,block)

if err != nil {

fmt.Println("Error on read: ",err)

}

}

输出如下

Error on read: unexpected EOF

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值