如何计算open()中oflag的位标志/枚举标志?

时间:2010-02-18 22:03:33

标签: c linux unix

我正在进行网络分配,我们的任务是使用我们提供的协议创建远程文件访问服务器。我遇到的困难是我找不到可以解释在open()中计算oflag参数位的过程。

我从客户端收到一条消息来打开一个文件,在消息中我解析了要在oflag中使用的标志的字符。具体来说,他们是:

  • R - O_RDONLY
  • W - O_WRONLY
  • RW - O_RDWR
  • A - O_APPEND
  • C - O_CREAT
  • T - O_TRUNC
  • E - O_EXCL

我绕过谷歌搜索按位操作,枚举标志,位标志,计算位标志等等,但找不到有助于确定如何为oflag创建位的内容。也许我只是不知道我在寻找什么,忽略了有用的信息?

有人可以请:

  • 指出方向/提供链接到文档/如何计算比特的示例/#我应该根据我的解析字符放入oflags或
  • 向我展示标志的枚举类型以及它们应该进入的顺序

非常感谢你的帮助,如果我不清楚我的问题或我想做什么,请告诉我,我会尽快澄清。

2 个答案:

答案 0 :(得分:4)

O_...标志是每个具有不同单个位集的数字。例如,在我的系统中,它们在fcntl.h中定义为

#define O_RDONLY             00
#define O_WRONLY             01
#define O_RDWR               02
#define O_CREAT            0100 /* not fcntl */
#define O_EXCL             0200 /* not fcntl */
#define O_NOCTTY           0400 /* not fcntl */
#define O_TRUNC           01000 /* not fcntl */
#define O_APPEND          02000

使用|(逻辑或)组合标记并将单个数字传递给open,并为所需的每个选项设置所有位。所以例如open("file", O_RDWR | O_CREAT)

如果需要,您可以计算一个int并将其传递给open。

int flags = 0;
if (...)
    flags |= O_RDWR;
...
open('file', flags);

答案 1 :(得分:0)

通常的表达方式类似于O_RDWR | O_CREAT。请注意O_RDWR正是O_RDONLY | O_WRONLY

您可以这样做:

char *flags = "r";
int oflag = 0;

if (strchr(flags,'r')) oflag |= O_RDONLY;

依旧等待其余的旗帜。