歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Linux系統編程之獲取文件信息

Linux系統編程之獲取文件信息

日期:2017/3/1 9:43:16   编辑:Linux編程

利用系統調用stat()、lstat()以及fstat(),可獲取與文件有關的信息,其中大部分提取自文件i節點。以上3個系統調用之間僅有的區別在於對文件的描述方式不同。

1 stat()返回所命名文件的相關信息。

2 lstat()與stat()類似,區別在於如果文件屬於符號鏈接,那麼所返回的信息針對的是符號鏈接自身(而非符號鏈接所指向的文件)。

3 fstat()則返回由某個打開文件描述符所指代文件的相關信息。

系統調用stat()和lstat()不需要對所操作的文件本身擁有任何權限,但針對指定pathname的父目錄要有執行(搜索)權限。而只要為它提供有效的文件描述符,fstat()系統調用總是成功的。

Linux stat函數講解(獲取文件詳細信息) http://www.linuxidc.com/Linux/2011-08/40701.htm

《Unix環境高級編程》(第二版)apue.h的錯誤 http://www.linuxidc.com/Linux/2011-04/34662.htm

Unix環境高級編程第二版讀書筆記 http://www.linuxidc.com/Linux/2011-04/34235.htm

《Unix環境高級編程》中apue.h的問題 http://www.linuxidc.com/Linux/2013-01/77686.htm

上述所有系統調用都會在緩沖區中返回一個由statbuf指向的stat結構,其格式如下:

設備ID和i節點號

st_dev字段標識文件所駐留的設備。st_ino字段包含了文件的i節點號。利用這兩個字段,可以在所有文件系統中唯一表示某個文件。

如果是針對設備的i節點,那麼st_rdev字段則包含設備的主、輔ID。利用宏major()和minor(),可以提取主、輔ID。在Linux系統上,要使用這兩個宏,需要定義_BSD_SOURCE宏,然後include定義這兩個宏的頭文件<sys/types.h>。

由於major()和minor()所返回的整型值大小隨UINX實現的不同而各有不用。為保證可移植性,打印時總是將返回值強制轉換為long。

文件所有權

st_uid和st_gid字段分別表示文件的屬主(用戶ID)和屬組(組ID)。

鏈接數

st_nlink字段包含了指向文件的(硬)鏈接數。

文件類型及權限

st_mode字段內含有位掩碼,起表示文件類型和指定文件權限的雙重作用。下圖為該字段所含各位的布局情況。

文件類型

權限

U

G

T

R

W

X

R

W

X

R

W

X

Linux使用了st_mode字段中的4位來標識文件類型位。st_mode字段與常量S_IFMT相與(&),可從該字段中提取出文件類型。將計算結果與一系列常量進行比較,即可確定文件類型:

if((statbuf.st_mode & S_IFMT) == S_IFREG)

printf(“regularfile\n”);

在Linux中可利用標准宏將其簡化:

if(S_ISREG(statbuf.st_mode))

printf(“regularfile\n”);

常 量

測 試 宏

文 件 類 型

S_IFREG

S_ISREG()

常規文件

S_IFDIR

S_ISDIR()

目錄

S_IFCHR

S_ISCHR()

字符設備

S_IFBLK

S_ISBLK()

塊設備

S_IFIFO

S_ISFIFO()

FIFO或管道

S_IFSOCK

S_ISSOCK()

套接字

S_IFLNK

S_ISLNK()

符號鏈接

針對stat結構中的st_mode來檢查文件類型的宏

想從<sys/stat.h>中獲取S_IFSOCK和S_ISSOCK()的定義,必須定義_BSD_SOURCE特性測試宏,或將_XOPEN_SOURCE定義為不小於500的值。

st_mode字段的低12位定義了文件權限。最低9位分別用來表示文件屬主、屬組以及其他用戶的讀、寫、執行權限。

文件大小、已分配塊以及最優I/O塊大小

對於常規文件,st_size字段表示文件的字節數。對於符號鏈接,st_size字段則表示鏈接所指路徑名的長度,以字節為單位。對於共享內存對象,該字段則表示對象的大小。

st_blocks字段表示分配給文件的總塊數,塊大小為512字節,其中包括了為指針塊所分配的空間。st_blocks字段記錄了實際分配給文件的磁盤塊數量。如果文件內含空洞,該值將小於從相應文件字節數字段(st_size)的值。

st_blksize字段所指並非底層文件系統的塊大小,而是針對文件系統上文件進行I/O操作時的最優塊大小(以字節為單位)。一般而言,st_blksize的返回值為4096。

更多詳情見請繼續閱讀下一頁的精彩內容: http://www.linuxidc.com/Linux/2014-06/103005p2.htm

Copyright © Linux教程網 All Rights Reserved