关于结构类型统计和系统调用函数,如S_ISREG

时间:2015-09-07 00:21:31

标签: gdb stat

所以我正在尝试理解内置函数,例如S_ISREG,S_IXUSR等。我无法理解这些函数返回或者它们一般做什么,以及它们如何与系统调用一起工作,如< strong> stat 这是(从我读过的)系统结构。

太棒了,很酷。但是我不明白这些变量或函数会返回什么?我读到它们彼此互相帮助,但输出是什么使st->st_mode返回使得它对函数S_ISREG有效?

总结一下:

S_ISREG等功能会收到什么以及它们会返回什么? struct type stat包含哪些内容使得它可以使用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;
    }

1 个答案:

答案 0 :(得分:0)

  

S_ISREG等功能会收到什么以及它们会返回什么?

S_ISREG不是大多数libc实现的函数,而是宏。您可以在/usr/include(或安装系统头文件的任何位置)中查找其定义:

grep -r S_ISREG /usr/include

确实standard表示&#34;应提供以下宏来测试文件是否属于指定类型。&#34;虽然我不相信它是标准的意图表示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(真)。

    return 1;
}