linux的文件 IO
生活随笔
收集整理的這篇文章主要介紹了
linux的文件 IO
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文件 io 和標準 io?區別:
1、緩沖區不同:標準 IO 有緩沖,文件 IO 無緩沖; 2、操作對象不同: ??????標準 IO 操作流 FILE *fp stdin stdout stderr ??????文件 IO 是文件描述符 STDIN_FILENO 3、操作函數不同?、 ????????fopen fclose fread fwrite fputs fgets fputc fgetc… ????????open close read write文件描述符
內核為高效管理已被打開的文件所創建的索引,用于指向被打開的文件; 所有的 IO 系統調用都通過文件描述符; 是一個簡單的非負整數,用來表明每個被進程打開的文件.程序剛剛啟動; 第一個打開的文件是 0,第二個打開的文件 1,以此類推. 0,1,2,3,...順序分配; 每個進程在啟動時會由 shell 自動打開 0,1,2 三個標準文件描述符; 當運行一個程序時有三個標準設備,默認系統都打開了; 標準輸入 STDIN_FILENO 0 標準輸出 STDOUT_FILENO 1 標準錯誤輸出 STDERR_FILENO 2?
open 函數
open:打開文件 #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> int open(const char *pathname, int flags); //如果文件存在時,適合調用該函數 int open(const char *pathname, int flags, mode_t mode); //如果文件不存在時,適合調用該函數?
?
read?從已打開的文件中讀取數據
#include <unistd.h> ssize_t read(int fd, void *buf, size_t count); 1)、返回值: 如果返回大于 0,表示讀取的字節數; 如果返回0,表示到達文件末尾; 如果返回-1,表示出錯,通過errno設置錯誤碼。 2)、參數: fd:?要讀的文件對應的文件描述符; buf:?讀到的數據需要存放的內存空間; count: buf的大小(最多讀取的字節數)。write:向一個已打開的可寫文件中寫入數據
ssize_t write(int fd, const void *buf, size_t count); 1)、返回值: 成功返回已寫的字節數; 失敗返回-1,并設置 errno。 2)、參數: fd:要寫的文件的文件描述符; buf: 要寫的數據的地址; count:要寫的數據的長度。close 關閉
int close(int fd);
功能:關閉一個文件描述符 返回值: 成功:0 失敗: -1 ,設置錯誤碼錯誤處理
1)、strerror(errno) - 映射 errno 對應的錯誤信息 2)、perror() – 輸出用戶信息及errno對應的錯誤信息 fd的返回值是-1,不是錯誤號!!! 全局錯誤碼:errno?
?
?lseek:定位一個已打開的文件
#include <sys/types.h> #include <unistd.h> off_t lseek(int fd, off_t offset, int whence);?SEEK_SET 只能為正;SEEK_END 只能為負;SEEK_CUR 可正可負;
在UNIX文件操作中,文件位移量可以大于文件的當前長度,在這種情況下,對該文件的下一次寫將延長該文件,并在文件中構成一個空洞,這一點是允許的。位于文件中但沒有寫過的字節都被設為 0。 如果 offset 比文件的當前長度更大,下一個寫操作就會把文件“撐大(extend)”。這就是所謂的在文件里創造“空洞(hole)”。沒有被實際寫入文件的所有字節由重復的 0 表示。空洞是否占用硬盤空間是由文件系統(file system)決定的。 空洞文件作用很大,例如迅雷下載文件,在未下載完成時就已經占據了全部文件大小的空間,這時候就是空洞文件。下載時如果沒有空洞文件,多線程下載時文件就都只能從一個地方寫入,這就不是多線程了。如果有了空洞文件,可以從不同的地址寫入,就完成了多線程的優勢任務。umask 函數為進程設置文件模式的屏蔽字
掩碼 open 實際創建新文件權限: ????????例如 umask(0000) open(0777) 最后是 0777 ????????例如 umask(0222) open(0777) 最后是 0555 ????????例如 umask(0222) open(0666) 最后是 0444 ????????例如 umask(0222) open(0555) 最后是 0555 實際創建新文件權限=umask 掩碼+open 給的權限。 注意這里只對創建文件有影響,已經創建的文件沒有影響拷貝文件描述符
dup 復制 oldfd,返回新文件描述符一定是當前可用文件描述符中的最小數值。
功能:復制一個文件描述符;
參數:oldfd 你要復制的文件描述符;
返回值:
成功: 返回新的文件描述符;
失敗:-1 ,設置錯誤碼;
獲取文件/目錄的屬性信息函數
#include <sys/types.h> #include <sys/stat.h> #include <unistd.h> int stat(const char *path, struct stat *buf); //獲取文件的屬性,如果文件是符號鏈接文件,則獲取它對應的目標文件屬性 int fstat(int fd, struct stat *buf); //打開文件之后才能使用該函數獲取文件屬性 int lstat(const char *path, struct stat *buf); //獲取文件的屬性,如果文件是符號鏈接文件,則獲取該符號鏈接文件屬性 lstat 類似 stat 返回值 成功:0?
失敗:-1 設置 errno 以上函數返回的文件信息用 struct stat 結構體表示 st_dev 設備號 32 位 寫字符設備驅動會用到 st_ino inode 節點 st_mode 權限 st_nlink 硬鏈接數,一般文件的硬鏈接數為 1,目錄,指的是目錄下的文件(或子目錄)的個數 st_uid 用戶 st_gid 用戶組 st_size 文件大小 st_atime 最后訪問時間 st_mtime 最后改動時間 st_ctime 最后狀態改變的時間 文件的鏈接 (1)硬鏈接 ln 相當于一個文件的別名的個數,rm 刪除僅僅一個別名 (2)軟鏈接 ln –s 相當于 windows 中的快捷方式獲取用戶和組的函數
如何根據用戶和組的 id 找到用戶名和組名? /etc/passwd 只有超級用戶才能讀取 man 3 getpwuid?根據 uid 拿到用戶名,通過返回結構體 passwd
?
根據 gid 去拿組名,通過 struct group
?
這里可取得組名 文件的權限和類型怎么做? 都放在 st_mode 中,unsigned int 4byte 32 位獲取文件類型的宏
包括文件類型權限等都在 32 位中 正常權限 rwxrwxrwx 9 位 st_mode 低 9 位的結構:?
?
總結
以上是生活随笔為你收集整理的linux的文件 IO的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【微信小程序】小程序原生代码生成海报
- 下一篇: Linux-centOS 安装nginx