日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

Linux文件属性2——使用stat函数获取文件属性

發布時間:2023/12/20 linux 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux文件属性2——使用stat函数获取文件属性 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

以下內容源于朱有鵬《物聯網大講堂》課程的學習整理,如有侵權,請告知刪除。


一、獲取文件屬性

1、stat、fstat、lstat函數簡介

  • 每個文件都附帶有一些屬性;
  • 屬性信息存在于文件本身中,只能被專用的API打開看到;
  • API有stat、fstat、lstat三個,作用一樣,參數不同,細節略有不同。

(1)linux命令行下,用stat命令查看文件屬性信息

  • 如stat a.out;
  • 用man 1 stat,man 2 stat查看,發現stat命令內部就是使用stat系統調用來實現的;



(2)stat的作用

  • 內核將某個文件的屬性信息結構體填充到stat函數的buf中;(參數里面,有指針,而且不加const,說明是輸出型參數
  • 當stat這個API調用從內核返回時,buf這個結構體就被文件的屬性信息填充好了;
  • 通過查看buff結構體變量的元素,就可以得知該文件的各種屬性。





(3)fstat和stat的區別

  • stat是從文件名出發得到文件屬性信息結構體,而fstat是從一個已經打開的文件fd出發,得到一個文件的屬性信息;
  • 如果文件沒有打開就用stat,如果文件已經被打開用fstat效率會更高(stat是從磁盤去讀取文件的,而fstat是從內存讀取動態文件的)

(4)lstat和stat/fstat的差別

  • 對于符號鏈接文件,stat和fstat查閱的是符號鏈接文件指向的文件的屬性,而lstat查閱的是符號鏈接文件本身的屬性。

2、struct stat結構體簡介

  • struct stat是內核定義的一個結構體,在<sys/stat.h>中聲明,見上圖;
  • 這個結構體中的所有元素加起來就是文件屬性信息;

3、代碼實戰

  • 寫代碼查看一些常見屬性信息,和直接用stat命令對比

#include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> #include <string.h> #include <stdlib.h>#define NAME "1.txt" //這樣寫的時候,注意該程序的路徑是在該文件的同路徑下int main(void) {int ret = -1;struct stat buf;//struct stat buf={0};初始化方法1,或者使用下面的memset(&buf, 0, sizeof(buf)); // memset后buf中全是0ret = stat(NAME, &buf); // stat后buf中有內容了if (ret < 0){perror("stat");exit(-1);}// 成功獲取了stat結構體,從中可以得到各種屬性信息了printf("inode = %d.\n", buf.st_ino);printf("size = %d bytes.\n", buf.st_size);printf("st_blksize = %d.\n", buf.st_blksize);return 0; }


二、stat函數的應用案例

1、用代碼判斷文件類型

(1)文件類型就是-、d、l……

(2)文件類型標志在struct stat結構體的mode_t ? ?st_mode元素中

  • unsigned int類型,每個bit位表示一個含義;
  • 由很多個標志位共同構成,記錄了很多信息,如果要查找時按位&操作就知道結果了;
  • 但是這些位定義不容易記住,因此linux系統事先定義很多宏來進行相應操作;
  • 譬如S_ISREG宏返回值是1表示這個文件是一個普通文件,如果文件不是普通文件則返回值是0;


2、用代碼判斷文件權限設置

(1)st_mode中除了記錄文件類型,還記錄著一個重要信息:文件權限。

(2)linux并沒有給文件權限測試提供宏操作,而是只提供位掩碼,所以我們只能用位掩碼來判斷是否具有相應權限。


3、代碼展示

#include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> #include <string.h> #include <stdlib.h>#define NAME "1.txt"int main(void) {int ret = -1;struct stat buf;memset(&buf, 0, sizeof(buf)); // memset后buf中全是0ret = stat(NAME, &buf); // stat后buf中有內容了if (ret < 0){perror("stat");exit(-1);}#if 0 // 判斷這個文件屬性//int result = S_ISREG(buf.st_mode);int result = S_ISDIR(buf.st_mode);printf("result = %d\n", result); #endif// 文件權限測試//unsigned int result = (buf.st_mode & S_IRWXU) >> 8;unsigned int result = ((buf.st_mode & S_IRUSR)? 1: 0);printf("file owner: %u.\n", result);return 0; }

總結

以上是生活随笔為你收集整理的Linux文件属性2——使用stat函数获取文件属性的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。