今天 我們重點來講講stat這個系統調用(因爲在編寫中經常用到所以重點提出來講解)
stat也是一個命令(主要記錄文件的一些基本信息)
其實stat也是一個結構體 linux操作系統爲了方便,報操作這個結構體的函數 也命名爲stat/lstat
首先我們先來看看這個結構體的具體成員
命令的顯示效果
由於我的ubuntu安裝了中文 大家可以一目瞭然的看見一些信息的意思。
1.這裏主要講解一下Inode號
Inode號是 每個文件系統區分不同文件的標識,通過遍歷目錄項得到inode號 來訪問inode結點
通過目錄項-》inode結點-》文件數據塊(我們前面提及到的淘寶分佈式存儲引擎也是這種相似的原理)
2.硬鏈接:可以理解成就是通過文件本身來訪問文件的內容(也是一種文件)
3.軟鏈接:可以理解成通過一個第三方來間接訪問這個文件的內容(就像你要找一個人找不到,但是你可以向第三人打聽消息,
這樣你就可以找到它了)
4.然後就是 stat結構體中的st_mode數據成員
我們可以通過這個成員來得到文件的權限 或者判斷文件是什麼類型的 只需要 位運算一下 & 看某個權限是否存在
也可以通過一些定義的宏來判斷文件的類型
接下來我們就通過一個簡單的demo來使用一下 通過stat是怎麼得到文件的信息的
stat/fstat都是相同的道理 就是函數操作文件的方式不一樣而已
lstat特殊一些
以上都是把文件的信息存入一個statbuf中
stat(穿透函數-軟連接) 如果讀取的文件就是軟連接根據軟連接讀取指向的文件信息
lstat(非穿透函數-不追蹤)如果讀取的文件就是軟連接就讀取軟連接文件的信息(由於軟連接也是一種文件)
代碼demo:
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#include <iostream>
#include <string.h>
#include <fcntl.h>
#include <errno.h>
using namespace std;
static int Debug = 1;
int32_t
main(int32_t argc, char* argv[])
{
int32_t fd = open("./tmp", O_RDWR | O_CREAT | O_EXCL, 0644);
if (fd < 0) {
fprintf(stderr, "create file error the reason is %s\n", strerror(errno));
exit(1);
}
ftruncate(fd, 200); // 擴容一下啊
unlink("./tmp"); // 刪除這個臨時文件 (在進程放棄這個文件使用之後)
int ret = 0;
struct stat statbuf;
if ((ret = fstat(fd, &statbuf)) < 0) {
fprintf(stderr, "stat file error the reason is %s\n", strerror(errno));
}else {
if (S_ISDIR(statbuf.st_mode)) {// 如果這個文件是一個目錄
if (Debug)printf("the file is a dir\n");
}
else {
if (Debug)printf("the file is not a dir\n");
printf("the file size : %d\n", statbuf.st_size);
}
}
close(fd);
return 0;
}
效果:
你看並沒有創建的文件,因爲我們已經在代碼中把文件刪除了 在close(fd)之後,所以以後對於臨時的文件 我們就可以採用這種操作
其實還有很多的關於文件操作的linux的api, 像什麼 symlink,link, readlink rename, access等等的都非常的簡單
用的時候只需要插一下相關的api就可以了
更多的C/C++ linux編程我會在下面的文章中陸續的分享,也可以關注‘奇牛學院’
來一起討論