2010-02-18 131 views
1

我正在进行网络任务,我们的任务是使用我们提供的协议创建远程文件访问服务器。我可能遇到的困难来自缺少的信息,这些信息解释了计算open()中oflag参数位的过程。如何计算open()中oflag的位标志/枚举标志?

我从客户端收到一条消息以打开一个文件,并在消息中解析用于inlag的标志字符。具体而言,他们是:

  • 的R - O_RDONLY
  • W - O_WRONLY
  • RW - O_RDWR
  • A - O_APPEND
  • Ç - O_CREAT
  • 笔 - O_TRUNC
  • ë - O_EXCL

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

可能有人请:

  • 点我的方向/提供连结到如何计算比特/#我应该文档/例子投入给我分析人物或
  • oflags告诉我枚举类型的标志,他们应该排序进去

多谢您的帮助,如果我不是我的问题还是什么,我试图做明确的,只是让我知道,我将尽快澄清。

回答

3

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 

您使用|(逻辑OR)的标志是一个数字与您希望每个选项中设置的所有位结合,并传递给open定义。所以例如open("file", O_RDWR | O_CREAT)

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

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

因此,例如,如果我解析RWC,然后将打开(“文件”,O_RDWR | O_CREAT)。但既然只知道字符,我会做int oflag =(02 | 0100),然后我打开看起来像打开(“文件”,oflag)?我需要从我解析到的二进制角色中解脱出来。 – Chris 2010-02-18 23:01:11

0

通常的表达式会像O_RDWR | O_CREAT。并注意O_RDWR正是O_RDONLY | O_WRONLY

你可以做这样的事情:

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

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

等为标志的其余部分。

+0

嗯......也许我是一个小混乱。假设我想用O_WRONLY |打开一个文件O_CREAT | O_APPEND,那里,我该如何计算一些int/bits放入?例如,我可以输入与那些flgas相对应的open(“myfile”,)吗? – Chris 2010-02-18 22:27:04

+0

@Chris:使用标志,而不是数字。在这种情况下,您可以使用open(“myfile”,O_WRONLY | O_CREAT | O_APPEND)。如果没有其他的话,阅读起来会更容易。 – 2010-02-18 23:02:35

+1

使用标志......这些标志位并不是全部标准化的,所以你不能假定它们在每个平台上都有相同的值。此外,符号形式更具可读性,因此可以维护...源代码是为了您的利益,而不是机器的。 – 2010-02-18 23:40:01