【问题标题】:Flags mask read and write posix标志掩码读写posix
【发布时间】:2014-08-05 03:58:37
【问题描述】:

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

accessMode = flags & O_ACCMODE; 

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

我想了解表达式标志和 O_ACCMODE 是如何工作的

抱歉,我用手机写的格式不正确

【问题讨论】:

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


    【解决方案1】:

    文件模式是互斥的。你不能是只读的只写的,你不能是读写的和其他两个中的任何一个。

    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) 为“1 等于 1”,自然返回 true。

    【讨论】:

      【解决方案2】:

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

      你需要屏蔽的原因是

      标志 = fcntl(fd, F_GETFL);

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

      1000000000000001

      只写文件。

      我们屏蔽是为了去掉那些与读/写权限无关的其他位。

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-09-08
          • 1970-01-01
          • 2016-11-20
          • 2014-05-21
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多