仅检查 O_RDONLY 标志以打开 (2)

标签 c unix system-calls bitwise-operators

我正在根据我在某些元文件中设置的权限检查发送到 open(2) 调用的标志。这里的 perms 与通常发送给 chmod 等调用的八进制值有关。我希望在 perms 与相关标志不匹配时输入 if block 。

if((perms == 4 && !(flags & O_RDONLY)) ||
   (perms == 2 && !(flags & O_WRONLY)) ||
   (perms == 6 && !(flags & O_RDWR))) 

我希望它能工作,并且它在 O_WRONLY 和 O_RDWR 中运行良好。但是,O_RDONLY 的实际值为 0,因此 & 运算符将为每个值返回 false。不幸的是,删除否定将导致每个 perms 值 4 跳过 if block 的不良行为。我怎样才能在这里实现我的目标?

最佳答案

最初,open 的第二个参数被称为 mode 并记录为 0、1 或 2。Later on ,该参数被重命名为 oflag,它现在可以包含除访问模式之外的标志。不过,模式的可能值保持不变,并为它们指定了符号名称,注意与标志不同的是,只有 O_RDONLYO_WRONLY、并且可以使用 O_RDWRPOSIX standard包括以下定义:

Mask for use with file access modes is as follows:
O_ACCMODE Mask for file access modes.

所以你可以使用((flags&O_ACCMODE) == O_RDONLY)等代码

关于仅检查 O_RDONLY 标志以打开 (2),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37891184/

相关文章:

c - malloc/free 是 libc 提供的系统调用还是库例程?

c - 是僵尸吗?

c - 自己编写的简单 memset 不适用于 ARMv7 上的 -03 eabi gcc

unix - 我如何在 Unix 文件中查看时间戳

bash - 如何使用 shell 脚本知道运行代码的当前服务器名称?

linux - 跟踪 : How to ascertain if a system call has called another system call?

C:为什么 LLVM 从左到右评估 printf 而 GCC 从右到左评估?

使用框架消息创建菱形

c - 在 C 中进行二进制算术的最佳方法?

linux - 如何在.sh文件中编写ssh连接代码以连接到远程计算机