2015-09-07 60 views
0

所以我想了解內置函數,如S_ISREG,S_IXUSR等。我無法理解像這些返回的函數或它們一般做些什麼以及他們如何處理系統調用,如stat這是(從我讀過的)系統結構。關於結構類型統計和系統調用函數,如S_ISREG

太棒了,很酷。但是我不明白的是這些變量或函數返回什麼?我讀到他們都互相幫助,但輸出是否st->st_mode返回,使其有效的功能S_ISREG接收?

要總括起來:

什麼樣S_ISREG函數接受?他們返回什麼呢?那麼結構類型統計信息包含哪些內容可以使其對S_ISREG進行驗證?

PS:我發現下面這個函數,我只是想更好地理解它。如果你想與下面的功能一起解釋,甚至更好。

static int 
    valid_cgi_script(struct stat *st) 
    { 
     if (!S_ISREG(st->st_mode)) 
      return 0; 

     if (!(st->st_mode & S_IXUSR)) 
      return 0; 

     if (cgi_uid >= 0 && cgi_gid >= 0) { 
      if (st->st_uid != cgi_uid || st->st_gid != cgi_gid) 
       return 0; 
     } 

     return 1; 
    } 

回答

0

什麼樣S_ISREG函數接受?他們返回什麼呢?

S_ISREG不是大多數libc實現中的函數,而是一個宏。你可以看一下它的定義/usr/include(或任何安裝在系統頭):

grep -r S_ISREG /usr/include 

事實上,standard說,雖然「下面的宏應提供測試文件是否是指定類型的。」我不相信的意圖的標準說S_ISREG必須是宏。

宏接收到一個整數st_mode,併產生一個整數,如果該文件不是常規文件,則該值爲0,如果是,則返回非零值。

static int 
valid_cgi_script(struct stat *st) 
{ 
    if (!S_ISREG(st->st_mode)) 

如果該文件不是常規文件,則返回0(false)。

 return 0; 

    if (!(st->st_mode & S_IXUSR)) 

如果該文件是不是誰擁有該文件的用戶可執行文件,返回0

 return 0; 

    if (cgi_uid >= 0 && cgi_gid >= 0) { 
     if (st->st_uid != cgi_uid || st->st_gid != cgi_gid) 

如果cgi_uidcgi_gid全局變量設置和文件的所有者或組不匹配他們,返回0.

  return 0; 
    } 

否則,返回1(true)。

return 1; 
} 
+0

那麼grep -r S_ISREG/usr/include部分肯定幫了我,我可以看到標題中的定義。現在我需要了解宏如何工作,但我只與他們合作,如 #define NUM 3 就是這樣。 但我看到的是這樣的: #define S_ISREG(mode)__S_ISTYPE((mode),__S_IFREG) 試圖找出這些定義是如何工作的 – Joe