假设文件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