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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > linux >内容正文

linux

Linux学习:文件属性函数

發(fā)布時(shí)間:2024/9/30 linux 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux学习:文件属性函数 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1、stat 命令

stat filename ,功能上類似于 ls - l。

2、stat 函數(shù)

(1)頭文件:

#include <sys/types.h>#include <sys/stat.h>#include <unistd.h>

(2)原型:

int stat(const char *pathname, struct stat *buf);

(3)參數(shù):
1)pathname :文件名稱(包含路徑,不寫默認(rèn)當(dāng)前目錄下)。
2)buf : 結(jié)構(gòu)體:結(jié)構(gòu)體元素為文件信息。
(4)返回值:
成功返回 0; 失敗返回 -1,設(shè)置 erron 。

3、使用 stat 函數(shù)獲得文件大小

struct stat st; int ret = stat(“bigtext.txt”, &st); if(ret == -1){ perror(“stat error”); exit(1); } printf(“file size = %d\n”, (int)st.st_size); // 注意類型強(qiáng)轉(zhuǎn),否則編譯有警告

4、使用 stat 函數(shù)獲得文件類型和權(quán)限

對(duì)應(yīng)結(jié)構(gòu)體中的元素是 mode_t 和st_mode。
類型:
(1)mode_t (本質(zhì)是一個(gè) 16 位的整數(shù),也稱位圖)。
(2)st_mode :16 位整數(shù),分 5 塊(特殊權(quán)限位不需要掌握),如下圖所示:

(1)0-2 bit :其他人權(quán)限
1)宏:S_IROTH ;八進(jìn)制數(shù):0004 ;權(quán)限:讀權(quán)限。
2)宏:S_IWOTH ;八進(jìn)制數(shù):0002 ;權(quán)限:寫權(quán)限 。
3)宏:S_IXOTH ;八進(jìn)制數(shù):0001 ;權(quán)限:執(zhí)行權(quán)限 。
(2) 3-5 bit :所屬組權(quán)限
1)宏:S_IRGRP;八進(jìn)制數(shù): 0040 ;權(quán)限:讀權(quán)限 。
2)宏:S_IWGRP ;八進(jìn)制數(shù):0020 ;權(quán)限:寫權(quán)限。
3)宏: S_IXGRP ;八進(jìn)制數(shù):0010 ;權(quán)限:執(zhí)行權(quán)限。
(3) 6-8 bit : 文件所有者權(quán)限
1)S_IRUSR ;0400 ;讀權(quán)限。
2)S_IWUSR ;0200; 寫權(quán)限。
3)S_IXUSR ;0100; 執(zhí)行權(quán)限。
(4)12-15 bit :文件類型
1)S_IFSOCK ;140000 ;套接字 。
2)S_IFLNK ;120000; 符號(hào)連接(軟鏈接)。
3)S_IFREG ;100000 ;普通文件。
4)S_IFBLK ;060000 ;塊設(shè)備。
5)S_IFDIR ;040000; 目錄。
6)S_IFCHR ;020000; 字符設(shè)備。
7)S_IFIFO ;010000 ;管道。
8)S_IFMT ;170000; 掩碼。

5、stat 、 lstat 、fstat 的 區(qū)別

int stat(const char *pathname, struct stat *buf); int lstat(const char *pathname, struct stat *buf); // 前兩個(gè)函數(shù)形式基本一樣 int fstat(int fd, struct stat *buf);

主要是在查看軟鏈接文件時(shí)候有區(qū)別:
(1)stat 是 讀取“軟鏈接指向的文件”的屬性 (穿透軟鏈接)。
(2)lstat 是 讀取“軟鏈接本身文件”的屬性(不穿透軟鏈接)。
(3)fstat 是使用 open 打開文件后,通過文件描述符讀取文件屬性。

6、實(shí)現(xiàn) ls -l filename

代碼如下:

#include <stdio.h> #include <unistd.h> #include <sys/stat.h> #include <string.h> #include <pwd.h> #include <grp.h> #include <time.h> int main(int argc, char *argv[]) {if(argc < 2){ perror("./a.out filename\n");return -1;}struct stat sb ; if( lstat(argv[1], &sb ) < 0 ) // 函數(shù)調(diào)用失敗,打印錯(cuò)誤信息,否則不執(zhí)行if,表示獲得信息成功 {perror("stat err"); return -1; } // 代碼執(zhí)行到這個(gè)位置,意味著獲得信息成功char fileMode[11] = {0}; // 比如 drwxr-xr-x 字符串 共10位+ \0 memset( fileMode, '-', 10); // 最后一位不格式//先搞定文件類型if(S_ISREG(sb.st_mode)) fileMode[0] = '-'; // regular fileif(S_ISDIR(sb.st_mode)) fileMode[0] = 'd'; // directoryif(S_ISCHR(sb.st_mode)) fileMode[0] = 'c'; // character deviceif(S_ISBLK(sb.st_mode)) fileMode[0] = 'b'; // block deviceif(S_ISFIFO(sb.st_mode)) fileMode[0] = 'p'; // FIFO (named pipe)if(S_ISLNK(sb.st_mode)) fileMode[0] = 'l'; // symbolic linkif(S_ISSOCK(sb.st_mode)) fileMode[0] = 's'; // socket//在搞定三類用戶的權(quán)限//用戶if(S_IRUSR & sb.st_mode) fileMode[1] = 'r'; // 否則因?yàn)閙emset ,默認(rèn)是 ’-’if(S_IWUSR & sb.st_mode) fileMode[2] = 'w';if(S_IXUSR & sb.st_mode) fileMode[3] = 'x';//組用戶if(S_IRGRP & sb.st_mode) fileMode[4 ]= 'r';if(S_IWGRP & sb.st_mode) fileMode[5] = 'w';if(S_IXGRP & sb.st_mode) fileMode[6] = 'x';//其他用戶if(S_IROTH & sb.st_mode) fileMode[7] = 'r';if(S_IWOTH & sb.st_mode) fileMode[8] = 'w'; if(S_IXOTH & sb.st_mode) fileMode[9] = 'x';//獲得用戶名和組名char *User = getpwuid(sb.st_uid)->pw_name; char *Group = getgrgid(sb.st_gid)->gr_name; //獲得時(shí)間 struct tm *fileTm = localtime(&sb.st_ctim.tv_sec);printf("%s %ld %s %s %ld %d月 %d %d:%d %s\n", fileMode, sb.st_nlink, User, Group, sb.st_size, fileTm->tm_mon+1, fileTm->tm_mday, fileTm->tm_hour, fileTm->tm_min,argv[1]);return 0; }

總結(jié)

以上是生活随笔為你收集整理的Linux学习:文件属性函数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。