日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux的文件 IO

發布時間:2024/1/1 linux 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 ,設置錯誤碼;

dup2 復制 oldfd,返回 newfd 指定新文件描述值; 功能:復制 oldfd newfd,此時 newfd oldfd 指向同一個文件,如果有需要先把 newfd 關閉。 注意: 如果 oldfd 不是一個有效的文件描述符,那么調用失敗,newfd 不會關閉; 如果 oldfd 是一個有效文件描述符,那么 newfd oldfd 有同樣的值,dup2()不做任何事并返回 newfd。 參數: oldfd 一會要復制; newfd 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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。