Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何计算open()中oflag的位标志/枚举标志?_C_Linux_Unix - Fatal编程技术网

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

C 如何计算open()中oflag的位标志/枚举标志?,c,linux,unix,C,Linux,Unix,我正在做一个网络任务,我们的任务是创建一个远程文件访问服务器,使用我们得到的协议。我的困难在于我找不到解释open()中oflag参数位计算过程的信息 我从客户端收到一条打开文件的消息,在该消息中,我解析要在oflag中使用的标志的字符。具体而言,它们是: R-Ordonly W-O_WRONLY RW-O_RDWR A-O_追加 C-O_创建 T-O_-TRUNC 不包括 我在Google上搜索了按位操作、枚举标志、位标志、计算位标志等,但找不到一些有用的东西,无法找出如何为oflag创建

我正在做一个网络任务,我们的任务是创建一个远程文件访问服务器,使用我们得到的协议。我的困难在于我找不到解释open()中oflag参数位计算过程的信息

我从客户端收到一条打开文件的消息,在该消息中,我解析要在oflag中使用的标志的字符。具体而言,它们是:

  • R-Ordonly
  • W-O_WRONLY
  • RW-O_RDWR
  • A-O_追加
  • C-O_创建
  • T-O_-TRUNC
  • 不包括
我在Google上搜索了按位操作、枚举标志、位标志、计算位标志等,但找不到一些有用的东西,无法找出如何为oflag创建位。也许我只是不知道我在寻找什么,而忽略了有用的信息

请某人:

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

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

通常的表达方式是
O_RDWR | O_create
。请注意,
O_RDWR
正是
O_RDONLY | O_WRONLY

您可以这样做:

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

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

其余的标志也是如此。

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

您可以这样做:

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

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

其余的标志也是如此。

这些标志都是数字,每个数字都有不同的单位设置。例如,在我的系统上,它们在
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|u CREAT)

你可以计算一个int,如果你想的话,也可以把它传给open

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

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|u CREAT)

你可以计算一个int,如果你想的话,也可以把它传给open

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

嗯。。。也许我有点困惑。假设我想用O|u WRONLY | O|u create | O|u APPEND打开一个文件,会不会有,我如何计算一些int/位来输入?例如,我可以输入与那些flgas相对应的open(“myfile”)吗?@Chris:使用标志,而不是数字。在这种情况下,您可以使用
open(“myfile”,O|WRONLY | O|u create | O|u APPEND)
。如果没有其他东西,它更容易阅读。使用标志。。。这些标志位并非都是标准化的,因此您不能假设它们在每个平台上都具有相同的值。此外,符号形式更具可读性,因此更易于维护。。。源代码是为了你的利益,而不是机器的利益。@Andrew,“O_RDWR完全是O_RDONLY | O_WRONLY”的评论是错误的。在大多数情况下,O_RDONLY是(00)O_WRONLY是(01),因此O_RDONLY | O_WRONLY是(01)。它与O_RDWR不同,O_RDWR是(02)mm。。。也许我有点困惑。假设我想用O|u WRONLY | O|u create | O|u APPEND打开一个文件,会不会有,我如何计算一些int/位来输入?例如,我可以输入与那些flgas相对应的open(“myfile”)吗?@Chris:使用标志,而不是数字。在这种情况下,您可以使用
open(“myfile”,O|WRONLY | O|u create | O|u APPEND)
。如果没有其他东西,它更容易阅读。使用标志。。。这些标志位并非都是标准化的,因此您不能假设它们在每个平台上都具有相同的值。此外,符号形式更具可读性,因此更易于维护。。。源代码是为了你的利益,而不是机器的利益。@Andrew,“O_RDWR完全是O_RDONLY | O_WRONLY”的评论是错误的。在大多数情况下,O_RDONLY是(00)O_WRONLY是(01),因此O_RDONLY | O_WRONLY是(01)。它与O_RDWR不同,O_RDWR是(02),因此,例如,如果我解析了RWC,那么它将是打开的(“文件”,O_RDWR | O_CREAT)。但既然我只知道字符,我会做一些类似int of lag=(02 | 0100)的事情,然后我的open看起来像open(“file”,of lag)?我需要从我解析的字符转换为二进制字符,例如,如果我解析了RWC,那么它将被打开(“file”,O|RDWR | O|u CREAT)。但既然我只知道字符,我会做一些类似int of lag=(02 | 0100)的事情,然后我的open看起来像open(“file”,of lag)?我需要从我解析的字符转换成二进制。