檔案和目錄之stat族函式——APUE學習筆記(2)
一. 函式原型及具體資料結構:
<code class="hljs cpp has-numbering"><span class="hljs-preprocessor">#include <sys/stat.h></span> <span class="hljs-keyword">int</span> stat(<span class="hljs-keyword">const</span> <span class="hljs-keyword">char</span> *retrict pathname, <span class="hljs-keyword">struct</span> stat *<span class="hljs-keyword">restrict</span> buf); <span class="hljs-keyword">int</span> fstat(<span class="hljs-keyword">int</span> fd, <span class="hljs-keyword">struct</span> stat *buf); <span class="hljs-keyword">int</span> lstat(<span class="hljs-keyword">const</span> <span class="hljs-keyword">char</span> *<span class="hljs-keyword">restrict</span> pathname, <span class="hljs-keyword">struct</span> stat *<span class="hljs-keyword">restrict</span> buf); <span class="hljs-keyword">int</span> fstatat(<span class="hljs-keyword">int</span> dirfd, <span class="hljs-keyword">const</span> <span class="hljs-keyword">char</span> *<span class="hljs-keyword">restrict</span> pathname, <span class="hljs-keyword">struct</span> stat *<span class="hljs-keyword">restrict</span> buf, <span class="hljs-keyword">int</span> flag); 所有四個函式返回值:成功返回<span class="hljs-number">0</span>,出錯返回-<span class="hljs-number">1.</span></code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li></ul>
其中buf指標為結構體指標,其結構如下:
<code class="hljs applescript has-numbering">struct stat { dev_t st_dev; /* device <span class="hljs-type">number</span> (<span class="hljs-type">file</span> system) */ dev_t st_rdev; /* device <span class="hljs-type">number</span> <span class="hljs-keyword">for</span> special files */ ino_t st_ino; /* inode <span class="hljs-type">number</span> (serial <span class="hljs-type">number</span>)*/ mode_t st_mode; /* <span class="hljs-type">file</span> type & mode (permissions) */ nlink_t st_nlink; /* <span class="hljs-type">number</span> <span class="hljs-keyword">of</span> hard links */ uid_t st_uid; /* user ID <span class="hljs-keyword">of</span> owner */ gid_t st_gid; /* group ID <span class="hljs-keyword">of</span> owner */ off_t st_size; /* size <span class="hljs-keyword">in</span> bytes, <span class="hljs-keyword">for</span> regular files */ blksize_t st_blksize; /* best IO block size*/ blkcnt_t st_blocks; /* <span class="hljs-type">number</span> <span class="hljs-keyword">of</span> <span class="hljs-number">512</span>B blocks allocated */ struct timespec st_atime; /* <span class="hljs-property">time</span> <span class="hljs-keyword">of</span> <span class="hljs-keyword">last</span> access */ struct timespec st_mtime; /* <span class="hljs-property">time</span> <span class="hljs-keyword">of</span> <span class="hljs-keyword">last</span> modification */ struct timespec st_ctime; /* <span class="hljs-property">time</span> <span class="hljs-keyword">of</span> <span class="hljs-keyword">last</span> status change */ };</code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li></ul>
結構體中的結構體成員timespce分別包含以秒和納秒為單位定義的時間,timespec提供更高的時間戳,結構如下:
<code class="hljs cs has-numbering"><span class="hljs-keyword">struct</span> timespec{ time_t tv_sec ; <span class="hljs-keyword">long</span> tv_nsec; };</code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li></ul>
二. stat族函式各自用途:
a.stat函式能根據pathname得到以此name命名的檔案的資訊結構。
b.lstat能夠根據pathname得到以此name命名的連線檔案的資訊結構。
–> 注意:lstat列出的是符號連線檔案本身,而不是連線引用的檔案。
–> 用途:需要以降序遍歷目錄層次結構時。
c.fstatat根據檔案描述符得到相應檔案的資訊結構。
d.fstatat函式操作的函式為:由fd引數指向的相對於當前開啟目錄的路徑名,返回檔案統計資訊。
引數:
(1). dirfd: 如果該引數被設定為AT_FDCWD時有以下兩種情況:
–> 當pathname為相對路徑時:fstatat會自己計算pathname相對於但當前目錄的引數。
–> 當pathname為絕對路徑時:dirfd引數會被丟棄。
(2). flag:該引數控制著是否跟隨著一個符號連線,如下:
–> flag預設情況下,fstata函式返回符號連線指向的實際檔案資訊。
–> 當AT_SYMLINK_NOFOLLOW標誌被設定,fstata不跟隨符號連線,而回返回符號連線本身資訊。
強大的fstatat:
fstatat函式通過改變flag引數的值,可以分別實現其餘stat族函式的功能。
三. 實際應用:
stat族函式使用最多的地方可能就是ls -l命令,此命令可以獲得當前目錄下的檔案所有資訊。
相關文章
- jdk7.NIO.2學習筆記之目錄檔案及許可權JDK筆記
- Symfony2學習筆記之目錄結構筆記
- RHCE7認證學習筆記6——管理檔案和目錄筆記
- Linux 學習筆記--目錄結構及檔案基本操作Linux筆記
- Linux學習筆記--rm命令(刪除檔案或目錄)Linux筆記
- 筆記:Linux命令(目錄和檔案管理)筆記Linux
- Java學習筆記之檔案Java筆記
- Spring學習筆記目錄Spring筆記
- pandas之常用基本函式學習筆記函式筆記
- linux學習(3)檔案和目錄管理Linux
- Linux stat函式獲取檔案屬性(檔案大小,建立時間等,判斷普通檔案或者目錄等)Linux函式
- 函式 - Go 學習記錄函式Go
- hive學習筆記之七:內建函式Hive筆記函式
- CUDA 學習筆記之函式限制符筆記函式
- async函式學習筆記。函式筆記
- Go 函式 學習筆記Go函式筆記
- 分析函式(學習筆記)函式筆記
- 生成函式 學習筆記函式筆記
- [Python]學習基礎篇:檔案和目錄Python
- JavaScript學習筆記(二)——函式和陣列JavaScript筆記函式陣列
- 【Go】Go語言學習筆記-2-函式Go筆記函式
- day10學習筆記之函式上筆記函式
- Scala 學習筆記(2)之類和物件筆記物件
- TS學習筆記(四):函式筆記函式
- JavaScript學習筆記 - 原生函式JavaScript筆記函式
- Golang學習筆記-1.6 函式Golang筆記函式
- Oracle學習筆記(6)——函式Oracle筆記函式
- LoadRunner函式學習筆記函式筆記
- MYSQL學習筆記14: 函式MySql筆記函式
- 深度學習——loss函式的學習筆記深度學習函式筆記
- linux目錄及檔案命令學習Linux
- C++學習筆記-----類和建構函式C++筆記函式
- EXT4檔案系統學習(15)VFS之VFS 檔案/目錄物件物件
- 安卓學習筆記---開篇(目錄結構)安卓筆記
- python學習筆記(六)——函式Python筆記函式
- OpenCV學習筆記(4)——mixChannels函式OpenCV筆記函式
- OpenCV學習筆記(5)——normalize函式OpenCV筆記ORM函式
- Flutter學習筆記(4)--Dart函式Flutter筆記Dart函式