【问题标题】: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 用作和掩码以获取访问模式位。