仅检查O_RDONLY标志是否打开(2)

时间:2016-06-17 22:22:29

标签: c unix system-calls bitwise-operators

我根据我在某些元文件中设置的权限检查发送到open(2)调用的标志。这里的perms与通常发送到chmod之类的调用的八进制值有关。我希望当perms与相关标志不匹配时输入if块。

if((perms == 4 && !(flags & O_RDONLY)) ||
   (perms == 2 && !(flags & O_WRONLY)) ||
   (perms == 6 && !(flags & O_RDWR))) 

我希望这可以工作,并且它在O_WRONLY和O_RDWR中运行良好。但是,O_RDONLY的实际值是0,所以& operator将为每个值返回false。不幸的是,删除否定将导致跳过if块的每个perms值4的不期望的行为。我怎样才能在这里实现目标?

2 个答案:

答案 0 :(得分:2)

最初,open的第二个参数称为模式,记录为0,1或2. Later on,参数重命名为 oflag ,除了访问模式外,它现在还可以包含标志。尽管如此,模式的可能值保持不变,并为它们提供了符号名称,但请注意,与标志不同,O_RDONLYO_WRONLYO_RDWR只有一个可用于。 POSIX standard包含以下定义:

  

用于文件访问模式的掩码如下:   
     O_ACCMODE屏蔽文件访问模式。

因此,您可以使用((flags&O_ACCMODE) == O_RDONLY)等代码

答案 1 :(得分:1)

使用

int open_mode = (flags & O_ACCMODE);

然后您可以使用以下支票:

(open_mode == O_RDONLY)