檔案和目錄之stat族函式——APUE學習筆記(2)

2puT發表於2016-07-11

一. 函式原型及具體資料結構:

<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命令,此命令可以獲得當前目錄下的檔案所有資訊。

相關文章