2015-09-07 67 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