對於linux作業系統來說,它是以檔案為基礎而設計的,即一切操作皆檔案。linux的檔案子系統主要用於管理檔案儲存空間的分配、檔案訪問許可權的維護、對檔案的各種操作。
檔案主要包含兩方面的內容:一是檔案本身所包含的資料;另一是檔案的屬性,也稱元資料,包括檔案的訪問許可權、所有者、檔案大小、建立日期等。
**檔案系統**是由一系列塊(block)構成的,每個塊的大小因不同的檔案系統而不同,但是乙個檔案系統一旦安裝之後,塊的大小就固定了。
對於核心而言,所有的開啟檔案都由檔案描述符表示。**檔案描述符**是乙個非負整數。在讀寫乙個檔案前,需要先呼叫open或create函式開啟檔案,成功執行這兩個上都將返回 乙個檔案描述符。檔案描述符的取值範圍0~nr_open(255)之間,也就是說每個程式最多只能開啟256個檔案。
檔案描述符 0 標準輸入檔案,即鍵盤
1 標準輸出檔案,即顯示器
2 標準錯誤輸出,一般也是指顯示器
一、檔案的分類
1. 普通檔案(regular file);
2. 目錄檔案(directory file):其內容是該目錄下的檔案和子目錄的資訊
3. 字元特殊檔案(character special file):用於表示系統中字元型別的裝置,比如鍵盤、滑鼠等,這些硬體對作業系統來說只是乙個檔案
4. 塊特殊檔案(block special file):用於表示系統中塊型別的裝置,如硬碟、光碟機等,一次至少讀乙個塊
5. fifo:命名管道用於程序間的通訊
6. 套接字(socket):用於網路通訊
7. 符號連線(symbolic link):指向另乙個檔案,是另一檔案的引用
#include
#include
int fd=open("b.txt",o_rdwr|o_creat|o_excl,0664);
if(-1==fd)
perror("open error");
exit(-1);
2. creat():檔案的建立
creat(const char *pathname,mode_t mode);如果pathname所指向的檔案不存在則重新建立,若存在則原檔案被新 檔案覆蓋
3.close(fd):關閉乙個已開啟的檔案。
呼叫成功時,返回值為0,否則返回-1
注意:close函式呼叫成功並不保證資料能全部寫回硬碟
4. size_t read(int fd,void *buf,size_t count)
從檔案描述符fd所指向的檔案中讀取count個位元組的資料到buf所指向的快取中。返回值表示實際讀取到的位元組數。
#include
#include
int res=read(fd,buf,6);
if(-1==fd)
perror("read"),exit(-1);
ssize_t write(int fd,const void *buf,size_t count)
將buf所指向的count個位元組資料寫入到由檔案描述符fd所指向的檔案中。
如果呼叫成功則返回寫入的位元組數
#include
#include
int res=write(fd,"hello",sizeof("hello"));
if(-1==res)
perror("write"),exit(-1);
三、檔案讀寫指標的移動
off_t lseek(int fildes,off_t offset,int whence);用來移動檔案讀寫指標的位置
引數fildes為已開啟的 檔案描述符,offset為根據引數whence來移動讀寫位置是的位移數
whence的取值 seek_set (0) 從檔案開始處計算偏移量
seek-cur (1) 從檔案指標當前位置開始計算偏移量
seek_end(2) 從檔案結尾處開始計算偏移量
(offset允許取負值)
#include
#include
int len=lseek(fd,-3,seek_set);
if(-1==len){
perror("lseek"),exit(-1);
四、檔案屬性的操作
1. 檢視檔案屬性,在shell下可通過輸入命令 ls -l 來檢視
2. 獲取檔案屬性,除了ls還可以通過函式stat()/fstat()/lstat()函式來檢視
3. 設定檔案屬性
hmod/dchmod 用來修改檔案的訪問許可權
chown/fchown/lchown 修改檔案的使用者id和組id
truncatr/ftruncate 改變檔案的大小
utime 改變檔案的st_mtime域和st_ctime域,即訪問時間和修改時間
umask 設定檔案建立時使用的遮蔽字
五、檔案的移動和刪除
1. int rename(const char* olspath,const char *newpath);
rename會將引數oldpath所指定的檔名稱改為newpath所指定的檔名稱
2. int unlink(const char *pathname) 刪除
int remove(const char *pathname)
注意:目錄檔案的刪除要使用rmdir系統呼叫
不清楚的函式可以找man那個男人幫忙哦!
linux中檔案描述符
在linux系統中,所有東西都可以看成是檔案,檔案又可以分為普通檔案,目錄檔案,鏈結檔案和裝置檔案。檔案描述符是核心為了高效管理已被開啟的檔案所建立的索引,是乙個非負整數用於指代被開啟的檔案,所有執行i o操作的系統呼叫都是通過檔案描述符。程式剛剛啟動的時候,0是標準輸入,1是標準輸出,2是錯誤輸出...
linux中檔案描述符fd和檔案指標flip的理解
簡單歸納 fd只是乙個整數,在open時產生。起到乙個索引的作用,程序通過pcb中的檔案描述符表找到該fd所指向的檔案指標filp。檔案描述符的操作 如 open 返回的是乙個檔案描述符,核心會在每個程序空間中維護乙個檔案描述符表,所有開啟的檔案都將通過此表中的檔案描述符來引用 而流 如 fopen...
linux中檔案描述符fd和檔案指標flip的理解
linux中檔案描述符fd和檔案指標flip的理解 簡單歸納 fd只是乙個整數,在open時產生。起到乙個索引的作用,程序通過pcb中的檔案描述符表找到該fd所指向的檔案指標filp。檔案描述符的操作 如 open 返回的是乙個檔案描述符,核心會在每個程序空間中維護乙個檔案描述符表,所有開啟的檔案都...