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

Chr*_*ris 1 c unix linux

我正在处理一项网络任务,我们的任务是使用给定的协议创建远程文件访问服务器。我的困难在于缺乏信息,我可以找到这些信息来解释在 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 创建位有用的东西。也许我只是不知道我在寻找什么而忽略了有用的信息?

有人可以请:

  • 为我指明方向/提供文档链接/如何计算位的示例/#鉴于我解析的字符或
  • 向我展示标志的枚举类型和它们应该进入的顺序

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

小智 5

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
Run Code Online (Sandbox Code Playgroud)

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

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

int flags = 0;
if (...)
    flags |= O_RDWR;
...
open('file', flags);
Run Code Online (Sandbox Code Playgroud)