在Golang中的低级磁盘I/O

7

想知道是否有人在进行低级磁盘I/O方面的实验,例如读取原始扇区、MBR等。我已经自己进行了一些挖掘,但是没有找到任何相关信息。大部分都是死胡同,其中有人谈论Go的本地io包。

如有线索,将不胜感激。


在*nix系统中,您可以读写/dev/下的原始设备文件。 - nos
是的,但如果有一种跨平台的方法来做这件事情就好了,因为Go是跨平台的……虽然如果必要的话可以用C编写所有代码。/dev/文件对我来说也没问题,因为我在所有设备上都运行*NIX。我知道它们在Windows中不存在。 - Sly
4
目前并没有适用于Go语言的跨平台API,顺便说一下,在Windows操作系统中,存在位于“\.\”命名空间下的特殊文件,例如“\.\PhysicalDisk0”或“\Device\XXX\”。 - nos
1
很可能在不久的将来,您会发现这样的通用API。无论如何,在Windows上访问磁盘与*NIX类似。 \\.\PhysicalDriveN\\.\X: http://support.microsoft.com/kb/100027(您在我之前发布了) - Tema
1
@FUZxxl 是的,我知道这完全取决于平台。我想知道是否有人已经尝试过使用Go具有本地能力进行低级磁盘I/O而不依赖于任何外部内容。我想,作为一种编译语言,它可能隐藏了一些有用的东西,我还没有机会看到。从这里的评论来看,似乎没有办法在不依赖于外部内容的情况下完成它。 - Sly
显示剩余5条评论
2个回答

9
我还不太熟悉 Go 语言,所以我的示例可能不是特别优雅,但我认为这就是你想要的:
package main

import (
    "syscall"
    "fmt"
)

func main() {
    disk := "/dev/sda"
    var fd, numread int
    var err error

    fd, err = syscall.Open(disk, syscall.O_RDONLY, 0777)

    if err != nil {
        fmt.Print(err.Error(), "\n")
        return
    }

    buffer := make([]byte, 10, 100)

    numread, err = syscall.Read(fd, buffer)

    if err != nil {
        fmt.Print(err.Error(), "\n")
    }

    fmt.Printf("Numbytes read: %d\n", numread)
    fmt.Printf("Buffer: %b\n", buffer)

    err = syscall.Close(fd)

    if err != nil {
        fmt.Print(err.Error(), "\n")
    }
}

这里有一个调用系统包的文档链接:http://golang.org/pkg/syscall/ 根据这个页面,该软件包试图与尽可能多的不同平台兼容,但对于我这样的新手来说,似乎主要目标是 Linux API,当然,使用 Go 语言的习惯用法来简化事情。希望这个回答解决了你的问题!

还没有机会检查这个,但无论如何因为努力而+1。 :D - Sly
我经过更深入的思考,实际上并不认为这个程序特别遵循Linux API,只是在系统调用函数命名上相似而已。我对其他操作系统了解不多,无法评论它们的函数命名是否相符。例如,即使系统调用Open并非创建文件,syscall.Open函数始终需要mode参数作为必要参数。 - waynr

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接