Флаги маскируют чтение и запись posix

Проверка режима доступа к файлу немного сложнее, так как константы O_RDONLY (0), O_WRONLY (1) и O_RDWR (2) не соответствуют отдельным битам во флагах состояния открытия файла. Поэтому, чтобы сделать эту проверку, мы маскируем значение флагов константой O_ACCMODE, а затем проверяем на равенство одну из констант:

accessMode = flags & O_ACCMODE; 

if (accessMode == O_WRONLY || accessMode == O_RDWR)               
    printf("file is writable\n");

Я хочу понять, как работают флаги выражения и O_ACCMODE.

Извините за плохое форматирование, пишу с телефона


person karim    schedule 14.06.2014    source источник


Ответы (3)


Режимы файлов взаимоисключающие. Вы не можете быть только для чтения и только для записи, и вы не можете быть доступны для чтения-записи и любого из двух других.

O_ACCMODE равен 3, поэтому биты 1 и 2 включены.

   00000000 (O_RDONLY)
&  00000011 (O_ACCMODE)
   --------
   00000000  <-- the result being compared

где 00000000 равно только для чтения, поэтому (accessMode == O_RDONLY) возвращает true.

То же самое для других.

   00000001 (O_WRONLY)
&  00000011 (O_ACCMODE)
  ---------
   00000001 <-- the result being compared

O_WRONLY равно 1, поэтому (accessMode == O_WRONLY) равно «1 равно 1», что, естественно, возвращает true.

person Duck    schedule 14.06.2014

Я не думаю, что приведенный выше ответ @Duck здесь является правильным. Учитывая примеры, нет смысла их маскировать.

Причина, по которой вам нужно маскироваться, заключается в том, что

флаги = fcntl(fd, F_GETFL);

возвращает больше, чем просто эти два бита. На самом деле возвращаемое значение может быть примерно таким:

1000000000000001

для файла только для записи.

Мы маскируем, чтобы избавиться от тех других битов, которые не связаны с разрешениями на чтение/запись.

person hellmean    schedule 20.08.2018

В этом O_ACCMODE используется как и маска для получения битов режима доступа.

person Naveen H    schedule 28.11.2016