检查文件的访问模式稍微复杂一些,因为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工作
抱歉格式不正确我在手机上写字
答案 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用作和掩码以获取访问模式位。