Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何匹配开放式和静态模式?_C_Unix_Posix_File Permissions - Fatal编程技术网

C 如何匹配开放式和静态模式?

C 如何匹配开放式和静态模式?,c,unix,posix,file-permissions,C,Unix,Posix,File Permissions,我正在使用open创建一个文件并设置其权限,然后使用stat获取文件权限……权限不匹配。 以下程序的结果是: 来自open(600)和stat(100600)的模式不同 如何比较由open(2)设置的模式(权限)和使用stat(2)检索的模式(权限)? #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <stdio.h> int main(in

我正在使用
open
创建一个文件并设置其权限,然后使用
stat
获取文件权限……权限不匹配。 以下程序的结果是:

来自open(600)和stat(100600)的模式不同



如何比较由
open(2)
设置的模式(权限)和使用
stat(2)
检索的模式(权限)?

#include <sys/types.h>
#include <sys/stat.h>

#include <fcntl.h>
#include <stdio.h>


int
main(int argc, char **argv, char **env) {
        
        const char *path = "/tmp/test";
        const mode_t mode = S_IRUSR | S_IWUSR;
        
        if (open(path, O_RDWR |  O_CREAT | O_EXCL, mode) == -1)
                err(1, "open for '%s' failed", path);
        
        struct stat sb;
        if (stat(path, &sb) != 0)
                err(2, "stat failed");
        
        if (mode != sb.st_mode)
                printf("mode from open (%o) and stat (%o) are different\n", 
                        mode, sb.st_mode);

        return 0;
}
#包括
#包括
#包括
#包括
int
主(内部argc、字符**argv、字符**env){
const char*path=“/tmp/test”;
const mode_t mode=S|u IRUSR | S|u IWUSR;
如果(打开(路径,O|RDWR | O|U创建| O|U排除,模式)=-1)
错误(1,“为“%s”打开失败”,路径);
结构统计某人;
如果(状态(路径和sb)!=0)
错误(2,“统计失败”);
如果(模式!=sb.st_模式)
printf(“打开(%o)和状态(%o)的模式不同\n”,
模式,sb.st_模式);
返回0;
}

感谢

这是因为
st_模式
成员不仅包含访问权限,还包含许多其他标志(例如,您可以检查文件是否为符号链接)

投票后,这让我找到了答案;我用密码回答我自己的问题

关键部分是sb.st_模式和RWX_UGO

因此,我最终得到了如下结果:

#define RWX_UGO (S_IRWXU | S_IRWXG | S_IRWXO)
//....
const mode_t file_mode = sb.st_mode & RWX_UGO;
if (mode == file_mode)
        printf("file_mode (%o) & RWX_UGO(%o) equals to(%o) which is "
                    "equal to mode(%o)\n", sb.st_mode, RWX_UGO, 
                    file_mode, file_mode);
else
        printf("mode from open (%o) and stat (%o) are different\n", 
                    mode, file_mode);

现在可以打印了

文件模式(100600)和RWX_UGO(777)等于(600),后者等于 模式(600)


谢谢你的回答。我已经阅读了文档,是的
st_模式
有更多信息,但是…问题是如何将
st_模式
open
中使用的t_模式进行比较。一个代码示例将非常有用useful@user454322您可以使用
0777
屏蔽噪声。顺便说一句,不知道为什么要测试模式是否相等。几乎可以肯定,使用提供的宏测试各个标志会更好。虽然数字编码的权限掩码经常出现在遗留代码中,但您应该避免在程序中使用数字值-Robbins&Robbins的UNIX系统编程使用的是
0777
safe?@user454322没错,严格地说,它不是绝对可移植的,尽管我不知道Unix系统上的
0777
并不意味着
rwx
。出于可移植性的原因,您可以将其替换为所有的
sui*
宏按位或合并在一起。@user454322
#define RWX