我根据我在某些元文件中设置的权限检查发送到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的不期望的行为。我怎样才能在这里实现目标?
答案 0 :(得分:2)
最初,open的第二个参数称为模式,记录为0,1或2. Later on,参数重命名为 oflag ,除了访问模式外,它现在还可以包含标志。尽管如此,模式的可能值保持不变,并为它们提供了符号名称,但请注意,与标志不同,O_RDONLY
,O_WRONLY
和O_RDWR
只有一个可用于。 POSIX standard包含以下定义:
用于文件访问模式的掩码如下:
O_ACCMODE
屏蔽文件访问模式。
因此,您可以使用((flags&O_ACCMODE) == O_RDONLY)
等代码
答案 1 :(得分:1)
使用
int open_mode = (flags & O_ACCMODE);
然后您可以使用以下支票:
(open_mode == O_RDONLY)