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