标志掩码读写posix

3

检查文件的访问模式稍微复杂一些,因为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");

我想了解表达式flags和O_ACCMODE是如何工作的。抱歉,我的格式可能有些不好,我是用手机写的。
3个回答

2
我认为@Duck在这里提出的答案(链接)是不正确的。根据例子,遮掩它们是没有意义的。
需要遮掩的原因是flags = fcntl(fd, F_GETFL);返回的不仅仅是这两个位。实际上,返回值可能像这样:
1000000000000001
对于只写文件。
我们进行遮掩以去除那些与读写权限无关的其他位。

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


0
在这里,O_ACCMODE 被用作与掩码以获取访问模式位。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接