所以我正在尝试理解内置函数,例如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;
}
答案 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_uid
和cgi_gid
个全局变量,并且文件的所有者或组与它们不匹配,则返回0.
return 0;
}
否则,返回1(真)。
return 1;
}