标志掩码读写posix

时间:2014-06-14 22:24:29

标签: c linux linux-kernel posix system-calls

检查文件的访问模式稍微复杂一些,因为O_RDONLY(0),O_WRONLY(1)和O_RDWR(2)常量与打开文件状态标志中的单个位不对应。因此,为了进行此检查,我们使用常量O_ACCMODE屏蔽flags值,然后使用其中一个常量测试相等性:

accessMode = flags & O_ACCMODE; 

if (accessMode == O_WRONLY || accessMode == O_RDWR)               
    printf("file is writable\n");

我想了解表达标志和表达方式。 O_ACCMODE工作

抱歉格式不正确我在手机上写字

3 个答案:

答案 0 :(得分:2)

文件模式是互斥的。您不能只读只读,并且您无法进行读写操作,也无法进行其他两种操作。

O_ACCMODE等于3,因此第1位和第2位打开。

   00000000 (O_RDONLY)
&  00000011 (O_ACCMODE)
   --------
   00000000  <-- the result being compared

其中00000000等于只读,因此(accessMode == O_RDONLY)返回true。

其他人也一样。

   00000001 (O_WRONLY)
&  00000011 (O_ACCMODE)
  ---------
   00000001 <-- the result being compared

O_WRONLY是1,因此(accessMode == O_WRONLY)是&#34; 1等于1&#34;这自然会回归真实。

答案 1 :(得分:1)

我认为@Duck here给出的上述答案是正确的。给定示例,将它们掩盖是没有意义的。

您需要屏蔽的原因是

flags = fcntl(fd,F_GETFL);

返回的不仅仅是这两位。实际上,返回值可能是这样的:

1000000000000001

用于只写文件。

我们屏蔽以除去与读/写权限无关的其他位。

答案 2 :(得分:0)

在此O_ACCMODE用作和掩码以获取访问模式位。