文件I/O
文件I/O #include <unistd.h>
①、不帶緩沖,每個read/write都調用內核中的相應系統調用 ②、通過文件描述符來訪問文件 常用文件I/O函數: open() /creat() . close(). read(). write(). lseek()文件描述符: 是一個非負整數。當打開一個現存文件或創建一個新文件時,內核向進程返回一個文件描述符。對于內核而言,所有打開文件都由文件描述符引用,當讀寫一個文件時,用open或creat返回的文件描述符標識該文件,將其作為參數傳遞給read或write。
1、open 和creat
調用返回的文件描述符一定是 最小的未用描述符數字
creat() 等價于open(pathname , O_CREAT|O_WRONLY|O_TRUNC,mode)
open()可以打開設備文件,但是不能創建設備文件,設備文件必須用mknod() 創建
ps: int mknod(const char *pathname, mode_t mode, dev_t dev);
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
2、read
ssize_t read(int fd, void *buf, size_t count);
example:
char buf[100];
read(fd,buf,sizeof(buf));
read調用成功返回讀取的字節數,如果返回0,表示到達文件尾,返回-1,表示出錯,通過errno設置錯誤碼。
buf參數由調用者分配內存,使用后,由調用者釋放。
3、write
ssize_t write(int fd, const void *buf, size_t count);
調用成功返回以寫字節數,失敗返回-1,并設置errno。
write的返回值通常于count不同,因此要循環將全部的數據寫入文件。
注意append參數時,寫的文件位置在文件尾。
4、lseek
off_t lseek(int fd, off_t offset, int whence);
調用lseek可顯示的定位一個已打開的文件
lseek文件只對常規文件有效,對socket、pipe、fifo等無效
.空洞文件有什么用?
空洞文件作用很大,例如迅雷下載文件,在未下載完成時就已經占據了全部文件大小的空間,這時候就是空洞文件。下載時如果沒有空洞文件,多線程下載時文件就都只能從一個地方寫入,這就不是多線程了。如果有了空洞文件,可以從不同的地址寫入,就完成了多線程的優勢任務。
https://blog.csdn.net/clamercoder/article/details/38361815
總結
- 上一篇: 基于PHP+小程序(MINA框架)+My
- 下一篇: 车载导航 android,手机都能当导航