文章目錄
文件和目錄管理
Linux下一切皆文件,目錄、軟鏈接和硬鏈接、設備等都可以視爲文件
索引號inode
inode在Linux中代表一個文件的索引節點,inode中存儲了一些文件的元信息
- 文件字節數
- 文件擁有者的User ID
- 文件組的Group ID
- 文件的讀寫權限
- 文件的時間戳
- 鏈接數
- 文件數據block的位置
使用stat命令可以查看某個文件的inode信息
//終端輸入
stat filename
//例如:文件tiem.c的inode信息如下
File: `time.c'
Size: 128 Blocks: 8 IO Block: 4096 regular file
Device: 801h/2049d Inode: 3545467 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2020-03-13 14:23:57.406913556 -0700
Modify: 2020-03-13 14:23:19.414915320 -0700
Change: 2020-03-13 14:23:48.838912714 -0700
Birth: -
inode的大小
inode也會消耗硬盤空間,所以磁盤格式化的時候,操作系統會自動將硬盤分爲兩個區域:數據區和inode區
- 數據區用於存放文件數據
- inode區用於存放inode包含的信息
每個inode的節點的大小,一般是128字節或者256字節。inode節點的總數,在格式化的時候就給定,一般是每1KB或每2Kb就設置一個inode。如果每KB就設置一個inode,那麼inode table的大小就會達到128M,佔整塊硬盤的12.8%
如果需要獲取Linux的inode的大小,可以使用以下命令
dumpe2fs -h /dev/sda1 | grep "Inode size"
如果需要查看每個硬盤分區的inode的總數和使用情況,可以使用以下命令
df -i
stat查看文件詳細信息
stat函數組可以獲取文件的詳細信息
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
//stat結構體內容如下:
struct stat {
dev_t st_dev; /* ID of device containing file */
ino_t st_ino; /* inode number */
mode_t st_mode; /* protection */
nlink_t st_nlink; /* number of hard links */
uid_t st_uid; /* user ID of owner */
gid_t st_gid; /* group ID of owner */
dev_t st_rdev; /* device ID (if special file) */
off_t st_size; /* total size, in bytes */
blksize_t st_blksize; /* blocksize for file system I/O */
blkcnt_t st_blocks; /* number of 512B blocks allocated */
time_t st_atime; /* time of last access */
time_t st_mtime; /* time of last modification */
time_t st_ctime; /* time of last status change */
};
int stat(cosnt char *path,struct stat *buf);
//參數*path:文件路徑
//參數*buf:文件信息
//返回值:成功爲0,否則爲-1
int fstat(int fd, struct stat *buf);
//參數fd:文件描述符
//參數:*buf:文件信息
//返回值:成功爲0,否則爲-1
int lstat(const char *path, struct stat *buf);
//參數*path:文件路徑
//參數*buf:返回文件信息,針對符號鏈接,lstat返回鏈接文件本身信息(而stat返回鏈接指向的文件信息)
//返回值:成功爲0,否則爲-1
stat、fstat、lstat函數使用實例
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>
int main()
{
int fd;
char *filename = "/home/linuxsystemcode/folder/1.txt";
fd = open(filename, O_RDWR);
if(fd < 0)
printf("Open file failed!\n");
struct stat info;
if(stat(filename,&info) < 0)
printf("Stat failed!\n");
else
printf("The file ID of dev: %ld %ld\n",info.st_dev,info.st_size);
if(fstat(fd,&info) < 0)
printf("Fstat failed!\n");
else
printf("The file ID of dev: %ld\n",info.st_dev);
if(lstat("/home/linuxsystemcode/folder/2",&info) < 0) //2爲文件1.txt的軟鏈接文件
printf("Lstat failed!\n");
else
printf("The file ID of dev: %ld %ld\n",info.st_dev,info.st_size);
return 0;
}
程序運行結果如下:
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-cNfi5k2n-1584456565152)(F:\Typora\圖片\1584428935459.png)]
chmod改變文件權限
文件是有訪問權限的,沒有相關的權限就無法對文件進行對應的操作
在終端輸入ls -l可查看文件詳細信息
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-8OnamGrx-1584456565155)(F:\Typora\圖片\1584429203687.png)]
- r表示文件可讀
- w表示文件可寫
- x表示文件可執行
- 轉化爲數字信息爲:r(4)、w(3)、x(1)
chmod相關函數
//頭文件
#include <sys/stat.h>
//相關函數
int chmod(const char *path, mode_t mode);
int fchmod(int fd, mode_t mode);
chmod函數使用實例
#include <stdio.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
char *filename = "/home/linuxsystemcode/folder/1.txt";
chmod(filename,0777);
return 0;
}
程序執行之後,文件的權限被更改
getcwd獲取當前路徑
Linux命令中可以使用pwd查看當前目錄,系統編程中getcwd可以實現同樣的功能
//頭文件
#include <unistd.h>
char *getcwd(char *buf, size_t size);
//參數buf:保存當前目錄的緩衝區
//參數size:buf的長度至少可以爲255字節
//返回值:成功返回指向當前目錄的指針,和buf值一樣,失敗返回NULL
//沒有參數,成功返回當前目錄的指針
char *get_current_dir_name(void);
mkdir創建目錄
Linux命令mkdir可以創建目錄,系統編程中mkdir函數可以創建目錄
//頭文件
#include <sys/stat.h>
#include <sys/types.h>
//mode_t可以使用數字
int mkdir(const char *pathname, mode_t mode);
rmdir刪除目錄
Linux命令rmdir可以刪除目錄,系統編程中rmdir可以刪除目錄
//頭文件
#include <unistd.h>
int rmdir(const char *pathname);
//成功返回0,否則返回-1
chdir切換目錄
Linux下chdir可以切換文件目錄
//頭文件
#include <unistd.h>
int chdir(const char *path);
//函數成功返回0,失敗返回-1
目錄的打開和關閉(opendir和closedir)
opendir和closedir是專門針對目錄的函數,用於打開和關閉目錄
//頭文件
#include <sys/types.h>
#include <dirent.h>
DIR *opendir(const char *name);
//成功返回指向目錄流的指針,失敗則返回NULL
int closedir(DIR *dirp);
//成功返回0,失敗返回-1
鏈接文件
Linux下的鏈接文件分爲兩種:硬鏈接和軟鏈接
在文章的開頭,介紹了inode的相關信息,硬鏈接相當於文件的複製,因爲它和源文件的inode號都是相同的,且文件內容會實時更新,硬鏈接可以用於備份重要文件,刪除一個硬鏈接並不影響節點本身和其它的鏈接
軟鏈接又稱爲符號鏈接,它實際上是一個文本文件,內容是源文件路徑,相當於windows下的快捷方式
使用ln命令可以創建鏈接文件,默認創建硬鏈接文件
硬鏈接
link函數可以創建一個硬鏈接文件
//頭文件
#include <unistd.h>
int link(const char *oldpath, const char *newpath);
軟鏈接
symlink可以創建一個軟鏈接(符號鏈接)
//頭文件
#include <unistd.h>
int symlink(const char *oldpath, const char *newpath);
解除鏈接
使用ulink函數可以解除文件鏈接,如果unlink指向軟鏈接,則刪除軟鏈接;如果指向最後一個硬鏈接,則刪除文件
//頭文件
#include <unistd.h>
int unlink(const char *pathname);
移動文件
Linux命令mv可以移動文件或目錄
//頭文件
#include <stdio.h>
int rename(const char *oldpath, const char *newpath);