stat,fstat以及lstat函式

2021-05-26 09:47:03 字數 2797 閱讀 3636

stat,fstat以及lstat函式

本章的討論的中心是三個stat函式以及它們所返回的資訊。

#include

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

int fstat(int filedes,struct stat*buf);

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

三個函式的返回:若成功為0,出錯為-1

給予乙個pathname,stat函式返回乙個與此命名檔案有關的資訊結構,fstat函式獲得已在描述符filedes上開啟的檔案的有關資訊。 lstat函式類似於stat,但是當命名的檔案是乙個符號連線時,lstat返回該符號連線的有關資訊,而不是由該符號連線引用的檔案的資訊。(在 4.2)節中當降序周遊目錄層次結構時,我們需要lstat。在4.16節中的較詳細地說明符號連線。)

lstat函式不屬於posix10031-1990標準,但很可能加到10031a中。svr4和4.3+bsd支援lstat。

第二個引數是個指標,它指向乙個我們應提供的結構。這些函式填寫由buf指向的結構。該結構的實際定義可能所實施而有所不同,但其基本形式是:

struct stat;

posix.1未定義stdevstksige和stblocks欄位。svr4和4.3+bsd則定義了這些字段。注意,除最後兩個以外,其它各成員都? 為基本系統資料型別(見2.7節)。我們將說明此結構的每個成員以了解檔案屬性。

stat函式的最大使用者很可能是ls-l命令,用其可以獲得有關乙個檔案的所有資訊。

4.3檔案型別

至今我們已介紹了兩種不同的檔案型別-普通檔案和目錄。unix系統的大多數檔案是普通檔案或目錄,但是也有另外一些檔案型別:

1.普通檔案(regular file)。這是最常見的檔案型別,這種檔案包含了某種形式的資料。至於這種資料是文字還是二進位制資料對於系統核而言並無區別。對普通檔案內容的解釋由處理該檔案的應用程式進行。

2.目錄檔案(directory file)。這種檔案包含了其它檔案的名字以及指向與這些檔案有關資訊的指標。對乙個目錄檔案具有讀許可數的任一程序都可以讀該目錄的內容,但只有系統核可以寫目錄檔案。

3.字元特殊檔案(charocter special file)。這種檔案用於系統中的某些型別的裝置。

4.塊特殊檔案(block special file)。這種檔案典型地用於磁碟裝置。系統中的所有裝置或者是字元特殊檔案,或者是塊特殊檔案。

5.fifo。這種檔案用於程序間的通訊,有時也將其稱為命名管道。在14.5對其進行說明。

6.套介面(socket)。這種檔案用於程序間的網路通訊。套介面也可用於在一台宿主機上的程序之間的非網路通訊。在第十五章,我們將用套介面進行進 程間的通訊。只有4.3+bsd才返回套介面檔案型別,雖然 svr4支援用套介面進行程序間通訊,但現在是經由套介面函式庫實現的,而不是通過系統核內的套介面檔案型別,將來的svr4版本可能會支援套介面檔案類 型。

7.符號連線(symboliclink)。這種檔案指向另乙個檔案。我們在4.16中將更多地述及符號連線。

檔案型別資訊,包含在stat結構的stode成員中。我們可以用圖4.1中的巨集確室檔案型別。這些巨集的引數都是stat結構中的stode成員。

圖4.1在中的檔案型別巨集

例項#include

#include

#include

int main( int argc, char *argv )

if ( s_isreg(buf.st_mode) )

else if ( s_isdir(buf.st_mode) )

else if ( s_ischr(buf.st_mode) )

else if ( s_isblk(buf.st_mode) )

else if ( s_isfifo(buf.st_mode) )

else if ( s_islnk(buf.st_mode) )

else if ( s_issock(buf.st_mode) )

else

printf( "%s/n", msg );

}exit (0);

}程式4.1取其命令列引數,然後針對每乙個命令列引數列印其檔案型別。

程式4.1對每個命令列引數列印檔案型別

程式4.1的樣本輸出是:

$ ./a.out /etc /etc/profile /dev/tty0 /dev/sda1 /dev/cdrom /dev/log

/etc:   directory

/etc/profile:   regular

/dev/tty0:      character special

/dev/sda1:      block special

/dev/cdrom:     symbolic link

/dev/log:       socket

(其中,在第一命令列末端我們鍵入了乙個反斜線,通知shell我們要在下一行繼續鍵入命令,然後shell在下一行上用其第二提示符提示我們特地使用 了lstat函式而不是stat函式以便檢測符號連線。如若使用了stat函式,則決不會觀察到符號連線。較早的unix版本並不提供ss***巨集,於是 就需要將stmode與遮蔽字sfmt邏輯與,然後與名為sf***的常數相比較。svr4和4.3+bsd在檔案中定義了此遮蔽字和相關的常數。如若我 們檢視此檔案,則可找到ssdir巨集定義為:

我們說過,普通檔案是最主要的檔案型別,但是觀察一下在乙個給定的系統中各種檔案的比例是很有興趣的。圖4.2中顯示了在乙個中等規模的系統中的統計值。這一資料是由4.21節中的程式得到的。

圖4.2不同型別檔案的計數值和比例 

stat,fstat以及lstat函式

本章的討論的中心是三個stat函式以及它們所返回的資訊。include int stat const char pathname,struct stat buf int fstat int filedes,struct stat buf int lstat const char pathname,s...

stat,fstat以及lstat函式

include int stat const char pathname,struct stat buf int fstat int filedes,struct stat buf int lstat const char pathname,struct stat buf 三個函式的返回 若成功為0...

什麼是網域名稱以及WSGI 以及URL 以及web

www.baidu.com baidu.com是網域名稱.com是網域名稱字尾.還有.cn org edu gov net等 url 統一資源定位符,也就是 www是worldwide wide web的意思 也叫全球資訊網,或web,是乙個由許多文字鏈結組成的超文字系統,通過internet訪問,...