[德] Michael Kerrisk
第4章 文件I/O: 通用的I/O模型
通用的I/O模型(the universal i/o model)
概述
所有執(zhí)行I/O操作的系統(tǒng)調(diào)用都使用文件描述符(file descriptor),通常時(shí)一個(gè)小的非負(fù)整數(shù)曾掂,來指代打開的文件。文件描述符用以指代所有類型的已打開文件坪它,包括管道(pipe)、FIFO养铸、socket崭放、終端电禀、設(shè)備和普通文件。每個(gè)進(jìn)程都有自己的文件描述符集(Each process has its own set of file descriptors.)己莺。
標(biāo)準(zhǔn)文件描述符
文件描述符 | 用途 | POSIX名稱 | stdio 流 |
---|---|---|---|
0 | 標(biāo)準(zhǔn)輸入 | STDIN_FILENO | stdin |
1 | 標(biāo)準(zhǔn)輸出 | STDOUT_FILENO | stdout |
2 | 標(biāo)準(zhǔn)錯(cuò)誤 | STDERR_FILENO | stderr |
程序運(yùn)行之前奏甫,shell程序打開了這3個(gè)文件描述符。更確切的說凌受,程序繼承了shell文件描述符的副本阵子。如果在命令行中對(duì)輸入/輸出進(jìn)行了重定向,shell會(huì)對(duì)文件描述符做適當(dāng)修改胜蛉,然后再啟動(dòng)程序挠进。
I/O的通用性
I/O模型的通用性色乾,體現(xiàn)在使用4個(gè)同樣的系統(tǒng)調(diào)用open(), read(), write()和close()可以對(duì)所有類型的文件執(zhí)行I/O操作,包括終端設(shè)備领突。
要實(shí)現(xiàn)I/O的通用性暖璧,就必須確保每一文件系統(tǒng)和驅(qū)動(dòng)程序都實(shí)現(xiàn)了相同的I/O系統(tǒng)調(diào)用集。
打開一個(gè)文件:open()
open()既能打開一個(gè)已經(jīng)存在的文件也能創(chuàng)建并打開一個(gè)新文件
#include <sys/stat.h>
#include <fcntl.h>
int open(const char *pathname, int flags, ... /* mode_t mode */);
Returns file descriptor on success, or –1 on error
讀取文件內(nèi)容:read()
read()從文件描述符fd所知帶的文件中讀取數(shù)據(jù)
#include <unistd.h>
ssize_t read(int fd, void *buffer, size_t count);
Returns number of bytes read, 0 on EOF, or –1 on error
寫入文件:write()
write()將數(shù)據(jù)寫入一個(gè)已打開的文件中
#include <unistd.h>
ssize_t write(int fd, void *buffer, size_t count);
Returns number of bytes written, or –1 on error
關(guān)閉文件:close()
colse()用來關(guān)閉一個(gè)打開的文件描述符君旦,并將其釋放會(huì)調(diào)用進(jìn)程澎办,供該進(jìn)程繼續(xù)使用。當(dāng)一進(jìn)程終止時(shí)金砍,將自動(dòng)關(guān)閉其已打開的所有文件描述符局蚀。
#include <unistd.h>
int close(int fd);
Returns 0 on success, or –1 on error
改變文件偏移量:lseek()
對(duì)于每個(gè)打開的文件,系統(tǒng)內(nèi)核會(huì)記錄其文件偏移量恕稠。文件偏移量時(shí)指執(zhí)行下一個(gè)read(),write()的文件起始位置琅绅。文
件第一個(gè)字節(jié)的偏移量為0。
#include <unistd.h>
off_t lseek(int fd, off_t offset, int whence);
Returns new file offset if successful, or –1 on error
lseek()并不適用于所有類型的文件鹅巍。不允許將其應(yīng)用于管道千扶,F(xiàn)IFO,socket或中斷骆捧。
在文件原結(jié)尾處之后某一位置寫入數(shù)據(jù)將導(dǎo)致文件空洞
澎羞,從文件空洞處讀取文件將返回全0字節(jié)。
原文鏈接
https://sun2y.me/