Linux学习:文件 I/O 函数
1、open 函數(shù)
(1)頭文件:
#include <sys/types.h> #include <sys/stat.h> #include <fcntl.h>(2)原型:
int open(const char *pathname, int flags); int open(const char *pathname, int flags, mode_t mode)(3)參數(shù):
1)flag :
必選:O_RDONLY 、O_WRONLY 、O_RDWR 三個必含且只能含其一(彼此互斥)。
可選:O_CREAT(文件不存在,創(chuàng)建文件)、 O_APPEND(原文件后追加內(nèi)容)、O_TRUNC(原文件清空,再添加內(nèi)容)、 O_NONBLOCK(設(shè)置非阻塞)。
2)mode:八進(jìn)制的數(shù),用于設(shè)置文件權(quán)限 ,但并不是創(chuàng)建文件的最終權(quán)限。
(4)返回值:
1)成功:返回新的文件描述符。
2)失敗:返回 -1,設(shè)置 errno。
“通過open創(chuàng)建的文件的權(quán)限” 跟 “實際權(quán)限” 的關(guān)系如代碼所示:
2、read 函數(shù)
(1)頭文件:#include <unistd.h>
(2)原型:
(3)參數(shù):
1)fd 文件描述符。
2) buf 傳出參數(shù):緩存區(qū),用于存放讀取的數(shù)據(jù)。
3)count 緩存區(qū)能存儲的最大字節(jié)數(shù) sizeof(buf)。
(4)返回值:ssize_t 類型(本質(zhì):有符號整形,意味著可以是負(fù)數(shù))
1)失敗:返回 -1
2)成功:> 0 讀出的字節(jié)數(shù) = 0 代表文件讀完了。
3、write 函數(shù)
(1)頭文件:#include <unistd.h>
(2)原型:
(3)參數(shù):
1) buf 傳入?yún)?shù):要寫入文件的數(shù)據(jù)。
2) count buf 的實際長度 , 如果先讀后寫,一般采用 read 的返回值 len。
(3)返回值:
1)失敗:返回 -1
2)成功:> 0 寫入的字節(jié)數(shù)。
4、lseek 函數(shù)
(1)頭文件:
#include <sys/types.h>#include <unistd.h>(2)原型:
off_t lseek(int fd, off_t offset, int whence);(3)參數(shù):
1)whence :設(shè)置文件指針的位置 。
2)offset :相對于文件指針位置的向后偏移量。
(4)返回值:文件指針的當(dāng)前位置(相對于頭部的偏移量)
(5)使用:
1)將文件指針移動到頭部: lseek(fd, 0, SEEK_SET);
2) 獲取文件指針的當(dāng)前位置: int len = lseek(fd, 0, SEEK_CUR);
3) 獲取文件長度: int len = lseek(fd, 0, SEEK_END);
4) 文件的拓展:原大小 100K 拓展為 1100K (拓展的 1000K 都是通過\0 占位):
第一步:lseek(fd, 1000, SEEK_END); //從尾部向后拓展 1000K
第二步:作一次寫操作 write(fd, “a”, 1);
注意:文件拓展其實常用函數(shù)實現(xiàn) truncate(fd, length)
5、阻塞和非阻塞
因為文件屬性產(chǎn)生了阻塞現(xiàn)象。
普通文件默認(rèn)非阻塞;管道、fifo、內(nèi)存映射區(qū)、套接字都默認(rèn)阻塞。
注意:open 時候可以通過 O_NONBLOCK 設(shè)置非屬性
總結(jié)
以上是生活随笔為你收集整理的Linux学习:文件 I/O 函数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: TCP概述
- 下一篇: Linux学习:文件属性函数