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

标签 c linux unix

我正在处理一项网络作业,我们的任务是使用给定的协议(protocol)创建远程文件访问服务器。我的困难在于缺乏我能找到的信息来解释计算 open() 中 oflag 参数的位的过程。

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

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

我在 Google 上四处搜索,搜索了按位运算、枚举标志、位标志、计算位标志等,但找不到有助于弄清楚如何为 oflag 创建位的东西。也许我只是不知道自己在寻找什么,而忽略了有用的信息?

有人可以吗:

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

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

最佳答案

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,并为您想要的每个选项设置所有位。所以例如打开("file",O_RDWR | O_CREAT)

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

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

关于c - 如何计算 open() 中 oflag 的位标志/枚举标志?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2292561/

相关文章:

c# - 如何使用 NLog 在 Linux 上的 var/log/my-app-dir 中添加日志文件和文件夹

c++ - 如何更改路径以修复错误“./main : error while loading shared library libmkl_core. 所以?

linux - Bash:为什么我不能为变量分配绝对路径?

linux - 从特定字段不以某些内容开头的文件中打印行

c - 在C语言中我们如何找到进程的作业ID?

c++ - 在系统驱动器 (C :\)) 中创建文件时,fopen 无形地失败

c++ - 访问违规写入位置,在我的循环中

c - c中函数的声明、调用和定义

c - 带缓存系统的代理实现

c - 如何检测 C 文件流是指向文件还是串行设备?