全部執行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
場景:當文件的偏移量超過了文件結尾
從文件結尾到新寫入的數據的開始位置的這一段空間被稱爲文件空洞。
文件空洞不佔用任何磁盤空間,知道持續某個點,在文件空洞寫入了數據系統纔會被磁盤分配磁盤塊。文件空洞的優點在於:與實際須要的空字節分配磁盤相比,稀疏填充的文件佔用更小的磁盤空間。不支持文件空洞的系統會將空字節寫入到文件。存在文件空洞意味名義上的大小要比佔用的磁盤存儲總量要大。