Gdb 关于结构类型stat和系统调用函数,如S_ISREG
因此,我试图理解内置函数,如S_ISREG、S_IXUSR等。我很难理解像这些函数返回的是什么,或者它们通常做什么,以及它们如何处理系统调用,比如stat,这是(从我读到的)一个系统结构 太棒了,太酷了。但我不明白的是这些变量或函数返回什么?我读到它们都互相帮助,但是Gdb 关于结构类型stat和系统调用函数,如S_ISREG,gdb,stat,Gdb,Stat,因此,我试图理解内置函数,如S_ISREG、S_IXUSR等。我很难理解像这些函数返回的是什么,或者它们通常做什么,以及它们如何处理系统调用,比如stat,这是(从我读到的)一个系统结构 太棒了,太酷了。但我不明白的是这些变量或函数返回什么?我读到它们都互相帮助,但是st->st\u模式返回的是什么输出,使函数S\u ISREG有效 总而言之: 像S_ISREG这样的函数接收什么,它们返回什么?struct type stat包含哪些内容使其能够被S_ISREG验证使用? PS:我在下面找到了这
st->st\u模式
返回的是什么输出,使函数S\u 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;
}
像S_ISREG这样的函数接收什么,它们返回什么
在大多数libc实现中,S_ISREG
不是一个函数,而是一个宏。您可以在/usr/include
(或安装系统头的任何位置)中查找其定义:
事实上,该标准规定“应提供以下宏来测试文件是否为指定类型”。尽管我不相信该标准的意图是说S_ISREG
必须是宏
宏接收一个整数st_mode
,如果文件不是常规文件,则生成一个整数0
,如果文件是常规文件,则生成一个非零整数
static int
valid_cgi_script(struct stat *st)
{
if (!S_ISREG(st->st_mode))
如果文件不是常规文件,则返回0(false)
如果文件不可由拥有该文件的用户执行,则返回0
return 0;
if (cgi_uid >= 0 && cgi_gid >= 0) {
if (st->st_uid != cgi_uid || st->st_gid != cgi_gid)
return 0;
}
如果设置了cgi\u uid
和cgi\u gid
全局变量,并且文件的所有者或组与它们不匹配,则返回0
return 0;
if (cgi_uid >= 0 && cgi_gid >= 0) {
if (st->st_uid != cgi_uid || st->st_gid != cgi_gid)
return 0;
}
否则,返回1(true)
grep-r的S_ISREG/usr/include部分确实帮助了我,我可以在标题中看到定义。现在我需要了解宏是如何工作的,但我只使用过像#define NUM 3这样的宏,仅此而已。但我看到的是:#define S#u ISREG(mode)u S_ISTYPE((mode),u S_IFREG)试图找出这些定义是如何工作的
return 1;
}