Linux的文件操作
1. 文件操作系統(tǒng)的調(diào)用
Linux的文件操作系統(tǒng)調(diào)用(在Windows編程領(lǐng)域,操作系統(tǒng)提供的接口稱為 API)涉及創(chuàng)建(create)、打開(open)、讀寫(read/write)和關(guān)閉(close)文件。
1.1 創(chuàng)建
int creat(const char *filename, mode_t mode)參數(shù)mode指定新建文件的存取屬性, 它和umask一起決定了文件的最終權(quán)限(mode&umask),其中,umask代表了文件在創(chuàng)建時需要去掉的一些存取權(quán)限。umask可以通過系統(tǒng)調(diào)用umask()來改變:
int umask(int newmask);該調(diào)用講umask設(shè)置為newmask, 然后返回舊的umask, 它只會影響讀、寫和執(zhí)行權(quán)限。
1.2 打開
int open(const char *pathname, int flags); int open(const char *pathname, int flags, mode_t mode);open()函數(shù)有2個形式, pathname是要打開的文件名(需要包含路徑名稱,缺省是未當(dāng)前路徑)。flags是文件打開標志,可以是一個值或者幾個值的組合
| 標志 | 含義 |
| O_RDONLY | 只讀方式 |
| O_WRONLY | 只寫方式 |
| O_RDWR | 讀寫方式 |
| O_APPEND | 追加的方式 |
| O_CREAT | 創(chuàng)建一個文件 |
| O_EXEC | 如果使用了O_CREAT而且文件已經(jīng)存在,就會發(fā)生一個錯誤 |
| O_NOBLOCK | 非阻塞的方式 |
| O_TRUNC | 如果文件已經(jīng)存在,則刪除文件的內(nèi)容 |
O_RDONLY、O_WRONLY、O_RDWR三個標志只能使用一個。
如果使用了O_CREAT標志, 那么使用的函數(shù)是int open(const char *pathname, int flags, mode_t mode);這個使用還要指定mode標志,用來表示文件的訪問權(quán)限。mode可以是一下組合
| 標志 | 含義 |
| S_IRUSR | 用戶可以讀 |
| S_IWUSR | 用戶可以寫 |
| S_IXUSR | 用戶可以執(zhí)行 |
| S_IRWXU | 用戶可以讀、寫、執(zhí)行 |
| S_IRGRP | 組可以讀 |
| S_IWGRP | 組可以寫 |
| S_IXGRP | 組可以執(zhí)行 |
| S_IRWXG | 組可以讀、寫、執(zhí)行 |
| S_IROTH | 其他人可以讀 |
| S_IWOTH | 其他人可以寫 |
| S_IXOTH | 其他人可以執(zhí)行 |
| S_IRWXO | 其他人可以讀、寫、執(zhí)行 |
| S_ISUID | 設(shè)置用戶執(zhí)行ID |
| S_ISGID | 設(shè)置組的執(zhí)行ID |
除了可以通過上述宏進行“或”邏輯產(chǎn)生標志以外,我們也可以自己用數(shù)字來表示,Linux用5個數(shù)字來表示文件的各種權(quán)限:第一位表示設(shè)置用戶ID;第二位表示設(shè)置組ID;第三位表示用戶自己的權(quán)限位;第四位表示組的權(quán)限;最后一位表示其他人的權(quán)限。每個數(shù)字可以取1(執(zhí)行權(quán)限)、2(寫權(quán)限)、4(讀權(quán)限)、0(無)或者是 這些值的和。例如,要創(chuàng)建一個用戶 可讀、可寫、可執(zhí)行,但是組沒有權(quán)限,其他人可以讀、可以執(zhí)行的文件、并設(shè)置用戶ID位,那么應(yīng)該使用的模式是1(設(shè)置用戶ID)、0(不設(shè)置ID)、7(1+2+4,讀、寫、執(zhí)行)、0(沒有 權(quán)限)、5(1+4,讀、執(zhí)行)即10 705:
open(“file”, O_CREAT, 10705);
上述語句等價于:
open("file", O_CREAT, S_IRWXU | S_IROTH | S_IXOTH | S_ISUID);
如果文件打開成功, open函數(shù)會返回一個文件描述符, 以后對該文件的所有操作就可以通過對這個文件描述符進行操作就可以實現(xiàn)。
1.3 讀寫
在文件打開以后, 我們才可以對文件進行讀寫,Linux中提供文件讀寫的系統(tǒng)調(diào)用是read、write函數(shù):
int read(int fd, const void *buf, size_t length); int write(int fd, const void *buf, size_t length);其中, 參數(shù) buf 為指向緩沖區(qū)的指針, length 為緩沖區(qū)的大小(以字節(jié)為單位)。函數(shù) read() 實現(xiàn)從文件描述符 fd 所指定的文件中讀取 length 個字節(jié)到 buf 所指向的緩沖區(qū)中, 返回值為實際讀取的字節(jié)數(shù)。 函數(shù) write 實現(xiàn)把 length 個字節(jié)從 buf 指向的緩沖區(qū)中寫入到 文件描述符 fd 所指向的文件中, 返回值為實際寫入的字節(jié)數(shù)。
以O(shè)_CREAT 為標志的 open 實際上實現(xiàn)了文件創(chuàng)建的功能, 因此, 下面的函數(shù)等同于 creat() 函數(shù):
int open(pathname, O_CREAT | O_WRONLY | O_TRUNC, mode);1.4 定位
對于隨機文件, 可以隨機指定位置進行讀寫, 使用如下函數(shù)進行定位:
int lseek(int fd, offset_t offset, int whence);lseek() 把文件讀寫指針相對 whence 移動 offset 個字節(jié)。 操作成功時, 返回文件指針相對于文件頭的位置。 參數(shù) whence 可以使用下屬值:
SEEK_SET:相對文件開頭
SEEK_CUR:相對文件讀寫指針的當(dāng)前位置
SEEK_END:相對文件末尾
offset 可取負值, 例如下面調(diào)用可以把文件指針相對當(dāng)前位置 向前移動5個字節(jié):
lseek(fd, -5, SEEK_CUR);由于 lseek 函數(shù)的返回值為文件指針相對于文件頭的位置, 因此下面調(diào)用的返回值就是文件的長度:
lseek(fd, 0, SEEK_END);
1. 5 關(guān)閉
當(dāng)我們操作完成以后, 要關(guān)閉文件,此時,只要調(diào)用close就可以了, 其中 fd 是要關(guān)閉的文件描述符:
int close(int fd);
?
?
?
?
?
?
總結(jié)
以上是生活随笔為你收集整理的Linux的文件操作的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机组装实验vr,教你如何组装一台能玩
- 下一篇: 计算机图形学基础徐文鹏知识点,计算机图形