Как рассчитать битовые флаги / перечислимые флаги для oflag в open ()? - PullRequest
1 голос
/ 19 февраля 2010

Я работаю над сетевым заданием, и нам поручено создать сервер удаленного доступа к файлам с протоколом, который нам дали. Мои трудности связаны с отсутствием информации, которую я могу найти, которая объясняет процесс вычисления битов для аргумента oflag в open ().

Я получаю сообщение от клиента, чтобы открыть файл, и в сообщении я анализирую символы для использования флагами в 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, учитывая мои проанализированные символы или
  • Покажите мне типы перечисления для флагов и порядок, в котором они должны указываться

Большое спасибо за вашу помощь, и если я не понял, в чем заключается моя проблема или что я пытаюсь сделать, просто дайте мне знать, и я уточню как можно скорее.

Ответы [ 2 ]

4 голосов
/ 19 февраля 2010

Флаги 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);
0 голосов
/ 19 февраля 2010

Обычное выражение будет что-то вроде O_RDWR | O_CREAT. И обратите внимание, что O_RDWR это точно O_RDONLY | O_WRONLY

Вы можете сделать что-то вроде этого:

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

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

и т. Д. Для остальных флагов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...