1. 程式人生 > >Linux學習筆記-基本操作5

Linux學習筆記-基本操作5

文件重命名 數字 找到 nod 學習筆記 HR 進入 locks 拓展

1. Linux文件操作相關函數

stat函數 :獲取文件屬性(從inode上獲取)
返回值:
成功:0
失敗:-1
文件屬性:
struct stat {
dev_t st_dev; //文件的設備編號
ino_t st_ino; //節點
mode_t st_mode; //文件的類型和存取的權限


nlink_t st_nlink; //連到該文件的硬連接數目,剛建立的文件值為1
uid_t st_uid; //用戶ID
gid_t st_gid; //組ID
dev_t st_rdev; //(設備類型)若此文件為設備文件,則為其設備編號
off_t st_size; //文件字節數(文件大小)

blksize_t st_blksize; //塊大小(文件系統的I/O 緩沖區大小)
blkcnt_t st_blocks; //塊數
time_t st_atime; //最後一次訪問時間
time_t st_mtime; //最後一次修改時間
time_t st_ctime; //最後一次改變時間(指屬性)
};

特性:能夠穿透(跟蹤)符號鏈接 (穿透的命令舉例:vi)

技術分享圖片


lstat函數
特性:不穿透(跟蹤)符號鏈接 (不穿透的命令舉例:ls -l 、rm)
區別:對軟鏈接,stat返回軟鏈接對應文件的大小。
lstat返回軟鏈接的大小。
access函數:測試指定文件是否擁有某種權限
原型:int access(const char *pathname, int mode);
pathname --> 文件名
mode --> 權限類別
R_OK 是否有讀權限
W_OK 是否有寫權限
X_OK 是否有執行權限
F_OK 測試一個文件是否存在
返回值:
0 --> 所有欲查核的權限都通過了檢查
-1 --> 有權限被禁止
chmod函數:改變文件的權限
原型:int chmod( const char *filename, int pmode );
filename --> 文件名
pmode --> 權限 必須是一個8進制數
返回值:
0 --> 改變成功
-1 --> 失敗
chown函數:改變文件的所有者
原型:int chown(const char *path, uid_t owner, gid_t group);
uid_t owner-->用戶名
gid_t group-->組名
(vi /etc/passwd有對應的數字,每一列的含義可以man 5 passwd查看)
返回值:
0 --> 成功
-1 --> 失敗
truncate函數:將參數path 指定的文件大小改為參數length 指定的大小。如果原來的文件大小比參數length大,則超過的部分會被刪去。
原型:int truncate(const char *path, off_t length);
path --> 文件路徑
length --> 指定的文件大小
返回值:
0 --> 執行成功
-1 --> 執行失敗
原文件長度 100
第二個參數指定長度為 20 --> 文件截斷
原文件長度 100
第二個參數指定長度為 300 -> 文件被拓展
鏈接函數:
link函數:創建一個硬鏈接
原型:int link(const char *oldpath, const char *newpath);
symlink函數:創建一個軟連接
readlink函數:讀軟連接對應的文件名,不是讀內容
unlink函數:如果想通過調用這個函數來成功刪除文件,你就必須擁有這個文件的所屬目錄的寫和執行權限。
使用:
1. 如果是符號鏈接,刪除符號鏈接
2. 如果是硬鏈接,硬鏈接數減1,當減為0時,釋放數據塊和inode
3. 如果文件硬鏈接數為0,但有進程已打開該文件,並持有文件描述符,則等該進程關閉該文件時,kernel才真正去刪除該文件。利用該特性創建臨時文件,先open或creat創建一個文件,馬上unlink此文件,直到關閉該文件時,該文件才會被刪除。
rename函數:文件重命名
函數原型:int rename(const char *oldpath, const char *newpath);

2. Linux目錄操作相關函數

chdir 函數:修改當前進程的路徑
原型:函數原型:int chdir(const char *path);
getcwd 函數:獲取當前進程工作目錄
函數原型:char *getcwd(char *buf, size_t size);
mkdir 函數:創建目錄
註意:創建的目錄需要有執行權限,否則無法進入目錄
函數原型:int mkdir(const char *pathname, mode_t mode(0777 8進制));
rmdir 函數:刪除一個空目錄
函數原型:int rmdir(const char *pathname);
opendir 函數:打開一個目錄 man 3 opendir (第三章)
函數原型:DIR *opendir(const char *name);
返回值:
DIR結構指針,該結構是一個內部結構,保存所打開的目錄信息,作用類似於FILE結構
函數出錯返回 NULL
readdir 函數:讀目錄
函數原型:struct dirent *readdir(DIR *dirp);
返回值:
成功返回一條記錄項:
struct dirent
{
ino_t d_ino; // 此目錄進入點的inode
ff_t d_off; // 目錄文件開頭至此目錄進入點的位移
signed short int d_reclen; // d_name 的長度, 不包含NULL 字符
unsigned char d_type; // d_name 所指的文件類型
har d_name[256]; // 文件名
};
失敗返回NULL
closedir 函數:關閉目錄

3. fcntl 函數:改變已經打開的文件的屬性,根據文件描述符來操作文件的狀態 -- #include <fcntl.h>

函數原型: int fcntl(int fd, int cmd);
int fcntl(int fd, int cmd, long arg);
int fcntl(int fd, int cmd, struct flock *lock);

技術分享圖片


例如:打開文件的時候: 只讀
修改文件的屬性: 添加追加 O_APPEND
flag = fcntl(fd,F_GETFL,0);
flag |= O_APPEND;
fcntl(fd,F_SETFL,flag);

4. dup, dup2函數

dup 函數:復制現有的文件描述符
原型:int dup(int oldfd);
返回值:的是文件描述符表中沒有被占用的最小文件描述符
dup2 函數:把oldfd復制文件描述符newfd,
1->如果new是一個被打開的文件描述符,在拷貝前先關掉new
2->如果old和new 是同一個,不會關掉new,直接返回的還是舊的文件描述符
原型:int dup(int oldfd,int newfd);
返回值:的是文件描述符表中沒有被占用的最小文件描述符


解決gcc編譯過程中c99語法報錯的問題
~/.bashrc
alias gcc=‘gcc -std=gnu99‘

索引節點inode:保存的其實是實際的數據的一些信息,這些信息稱為“元數據”(也就是對文件屬性的描述)。
例如:文件大小,設備標識符,用戶標識符,用戶組標識符,文件模式,擴展屬性,文件讀取或修改的時間戳,
鏈接數量,指向存儲該內容的磁盤區塊的指針,文件分類等等。
( 註意數據分成:元數據+數據本身 )

註意inode怎樣生成的:每個inode節點的大小,一般是128字節或256字節。inode節點的總數,在格式化時就給定
(現代OS可以動態變化),一般每2KB就設置一個inode。一般文件系統中很少有文件小於2KB的,所以預定按照2KB分,
一般inode是用不完的。所以inode在文件系統安裝的時候會有一個默認數量,後期會根據實際的需要發生變化。

註意inode號:inode號是唯一的,表示不同的文件。其實在Linux內部的時候,訪問文件都是通過inode號來進行的,
所謂文件名僅僅是給用戶容易使用的。當我們打開一個文件的時候,首先,系統找到這個文件名對應的inode號;然後,
通過inode號,得到inode信息,最後,由inode找到文件數據所在的block,現在可以處理文件數據了。

inode和文件的關系:當創建一個文件的時候,就給文件分配了一個inode。一個inode只對應一個實際文件,
一個文件也會只有一個inode。inodes最大數量就是文件的最大數量。

Linux學習筆記-基本操作5