Linux學習筆記(文件操作)

文件描述符
講到文件 我們就需要知道什麼是文件描述符,我們所有對設備和文件的操作都是使用文件描述符來進行的。
通常用fd表示文件描述符。

文件描述符是一個非負的整數,它是一個索引值,並指向在內核中每個進程所打開的文件的記錄表

當需要讀寫文件時,需要把文件描述符作爲參數傳遞給相應的函數。

通常在一個進程啓動時,都會打開三個文件:
標準輸入:對應的文件描述符爲0(STDIN_FILENO)
標準輸出:對應的文件描述符爲1(STDOUT_FILENO)
標準出錯處理:對應的文件描述符爲2(STDERR_FILENO)

我們可以通過命令來查看系統文件描述符的個數:
1:cat /proc/sys/fs/file-max
在這裏插入圖片描述
這裏面的100624是系統支持的所有用戶打開文件描述符的總和

2:ulimit -n
在這裏插入圖片描述
這裏的1024是對每個進程的限制,即每一個用戶登錄後執行的程序佔用文件描述符不能超過1024個

文件指針與FILE結構體
每一個進程在PCB(Process Control Block)即進程控制塊中都保存着一分文件描述符表,文件描述符就是這個表的索引,文件描述符表中每個表項都有一個指向已打開文件的指針。現在我們明確一下:已打開的文件在內核中用file結構體表示,文件描述符表中的指針指向file結構體。

struct FILE
{
	char *_ptr;//文件輸入的下一個位置
	int _cnt;//當前緩衝區的相對位置
	char *_base;//指基礎位置(文件的起始位置)
	int _flag;//文件標誌
	int _file;//文件的有效性驗證
	int _charbuf;//檢查緩衝區狀況,如果緩衝區則不讀取
	int _bufsiz;//文件的大小
	char *_tmpfname;//臨時文件名
};

如上所示
FILE結構體中存放着文件的信息

文件指針與文件描述符的相互轉換

#文件描述符轉文件指針
FILE *fdopen(int filedes, const char *opentype);

#文件指針轉文件描述符
int fileno(FILE *stream);

inode結點
在每一個文件中都會有一項屬性,就是inode,它存放着除了文件名以外的所有文件信息,中文名爲“索引節點”。

inode包含的文件信息
* 文件的字節數
* 文件擁有者的User ID
* 文件的Group ID
* 文件的讀、寫、執行權限
* 文件的時間戳,共有三個:ctime指inode上一次變動的時間,mtime指文件內容上一次變動的時間,atime指文件上一次打開的時間。
* 鏈接數,即有多少文件名指向這個inode
* 文件數據block的位置
可以用stat命令,查看某個文件的inode信息:
在這裏插入圖片描述
操作系統可以通過這個inode號碼來識別不同的文件,並且當遇到文件名無法刪除時可以通過inode來刪除文件
例如find ./ -inum 812687|xargs rm-f
就可以刪掉該文件

可以用df -i來查看每個硬盤分區的inode總數和已經使用的數量:
在這裏插入圖片描述

關於操作文件的函數

open()打開文件
int open(const char *pathname, int flags, mode_t mode);
flags:
//open(文件名,文件訪問權限, 文件權限);
//O_CREAT 若文件不存在則創建
//O_RDWR 文件訪問的讀寫權限
//O_APPEND 以追加內容的方式打開文件
//O_EXCL 若創建文件的時候文件存在則報錯退出
mode可以不寫,默認爲664

close()關閉文件
int close(int fd);

lseek()跳轉文件指針
off_t lseek(int fd, off_t offset, int whence);
SEEK_SET 從起始位置
SEEK_CUR 從文件指針當前位置
SEEK_END 從文件末尾
offset:偏移的長度
lseek(fd , 1024, SEEK_END);
從文件末尾向前跳轉1024字節

read()讀文件
ssize_t read(int fd,void* buffer,size_t count);
返回值爲讀取的實際長度,當讀取失敗時返回-1

write() 寫文件
ssize_t write(int fd, const void *buf, size_t count);
返回實際的寫入長度, -1則寫入失敗

access ()對文件進行判斷
int access(const char *pathname, int mode);
F_OK 判斷文件是否存在 0-存在
R_OK 判斷文件是否可讀
W_OK 判斷文件是否可寫
X_OK 判斷文件是否可執行

寫一個文件拷貝函數
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
運行結果如下
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章