全部执行I/O操做的系统调用,都使用一个非负整数(文件描述符)来描述打开的文件(文件、管道、socket、终端、设备)。
文件描述符 | 用途 | POSIX名称 | stdio流 |
---|---|---|---|
0 | 标准输入 | STDIN_FILENO | stdin |
1 | 标准输出 | STDOUT_FILENO | stdout |
2 | 标准错误 | STDERR_FILENO | stderr |
可见golang的系统调用没有count参数,默认Buffer的大小为count的长度。golang
下面是一段代码,用来进行文件的复制,没有检查所有的errorsocket
func Copy(oldFile, newFile string) { inputFd, err := syscall.Open(oldFile, os.O_RDONLY, 0666) if err != nil { panic(err) } // 此处用到了部分flags指定文件的打开方式,mode指定文件的访问权限下一篇继续 outputFd, err := syscall.Open(newFile, os.O_RDWR|os.O_CREATE|os.O_TRUNC|os.O_APPEND, 0666) if err != nil { panic(err) } defer syscall.Close(inputFd) defer syscall.Close(outputFd) buff := make([]byte, 10) for { size, _ := syscall.Read(inputFd, buff) if size == 0 { break } syscall.Write(outputFd, buff[:size]) } }
open函数会返回下面这些错误:函数
在系统调用中存在一个Create的系统调用,不过在golang中,这个func Creat(path string, mode uint32) (fd int, err error)
是使用open()这个系统调用实现的。ui
read调用成功,将返回实际读取的字节数,若是文件结束(EOF)则返回0。操作系统
num, err := syscall.Write(fd, buff)
,num为写入的数量,通常等于len(buff),当num<len(buff)
,这就被称为"部分写",多是磁盘不足,write的调用成功不表明写入数据成功。指针
操做系统会保存打开文件的偏移量(也称读写偏移量或指针)。只适用于文件。code
lssek在golang中为func Seek(fd int, offset int64, whence int) (off int64, err error)
进程
fd: 文件描述符
offset: 文件偏移量
whence: 按照什么基点解释offset参数资源
whenceinput
场景:当文件的偏移量超过了文件结尾
从文件结尾到新写入的数据的开始位置的这一段空间被称为文件空洞。
文件空洞不占用任何磁盘空间,知道持续某个点,在文件空洞写入了数据系统才会被磁盘分配磁盘块。文件空洞的优点在于:与实际须要的空字节分配磁盘相比,稀疏填充的文件占用更小的磁盘空间。不支持文件空洞的系统会将空字节写入到文件。存在文件空洞意味名义上的大小要比占用的磁盘存储总量要大。