| Открытие файла: open() |
|
Мы уже знаем один способ открытия файла посредством системного вызова creat (). Но в этом случае файл всегда открывается в режиме "только запись" и, к тому же, если файл уже существует, то он попросту будет очищен. Кроме того, нет никаких адекватных механизмов проверки того, существовал ли файл вообще. Открыть файл определенным образом можно через системный вызов open(). Приятная особенность open() — возможность установки флагов открытия файла, благодаря которым процесс открытия файла становится контрол ируемы м. Флаги открытия файла (как и флаги режима) представляют собой набор символических констант, которые могут соединяться операцией побитовой дизъюнкции (ИЛИ). Чтобы использовать эти флаги и системный вызов open (), в программу необходимо включить заголовочный файл fcntl.h.
Обычно имена заголовочных файлов перекликаются с механизмами, которые в них объявлены. Например, stdio.h расшифровывается как "STanDard Input/ Output". Неблагозвучное имя fcntl.h образовано от словосочетания "File CoNTroL". Результат объединения флагов открытия файла представляет собой обычное целое число. В следующем списке указаны лишь самые "популярные" из них:
Системный вызов open (), объявленный в заголовочном файле fcntl.h, имеет два прототипа: int open (const char * FILENAME, int FLAGS, mode_t MODE); Как уже сообщалось, подобная двойственность прототипа достигается благодаря механизму va_arg (он же stdarg), являющемуся частью стандарта языка С. Аргументы filename и mode полностью аналогичны соответствующим аргументам системного вызова creat (). Второй прототип open () обычно используется для открытия файлов в режиме "только чтение", когда указание режима является избыточным. Аргумент flags представляет собой набор флагов открытия, объединенных операцией побитового или. Следует отметить, что некоторые флаги не могут объединяться между собой. Здесь нужно рассуждать логически. Нельзя, например, объединить флаги o_rdonly и o_wronly, поскольку они противоречат друг другу. Очень часто в качестве аргумента mode системных вызовов creat () и open () указывают не объединенные операцией побитовой дизъюнкции (ИЛИ) именованные константы, а числа в восьмеричной системе счисления. Такое представление называют восьмеричным представлением прав доступа. Возможно, вы никогда не будете применять такой подход, однако умение видеть права доступа в восьмеричной форме может пригодиться при чтении чужих программ. В ранних Unix-подобных системах не было именованных констант из sys/stat.h. Для записи прав доступа использовались только восьмеричные числа. Для записи прав доступа, которые занимают 9 бит режима файла, достаточно трех восьмеричных цифр. При этом следует учитывать, что биты отсчитыва-ются справа налево (little endian). Восьмеричная запись битов прав доступа удобна тем, что каждой восьмеричной цифре соответствует последовательность из трех бит.
Чтобы проверить, как это работает на практике, напишем небольшую программу, которая для начала выводит на экран права доступа в десятичном представлении. Программа mymask.c #include <stdio.h> Проверим, что получилось: $ gcc -о mymask mymask.c Итак, правам доступа "чтение и запись для владельца" плюс "чтение для группы и остальных пользователей" соответствует число 420. Теперь переведем это число в восьмеричную систему счисления: $ be -q Получилось 644. Переведем полученное число в двоичную систему счисления: $ be -q Теперь пронумеруйте полученную цепочку от 0 до 8 справа налево. Это и есть биты прав доступа. Кроме того, если наложить эти биты на привычный нам шаблон rwxrwxrwx, который выводит программа Is, заменив все нули дефисами, то получим права доступа в удобном для чтения виде: rw-r—г— Теперь можно систематизировать знания, полученные в результате эксперимента. Итак, восьмеричные права доступа состоят из трех цифр:
Если запомнить, что означает каждая цифра, то работа с восьмеричными правами не будет вызывать никаких затруднений (в скобках даны двоичные значения):
Восьмеричные права доступа также можно использовать с программой chmod: $ touch myfile Работая с таким представлением прав доступа в программах на языке С, следует помнить, что восьмеричное число должно начинаться с нуля (в противном случае оно будет интерпретировано компилятором как десятичное). Рассмотрим теперь программу, которая создает файл при помощи системного вызова open () Программа creatopen.с #include <stdio.h> В первую очередь следует отметить, что системный вызов creato полностью идентичен open (), вызванному с флагами открытия o_wronly, o_creat и o_truwc. Если не верите, посмотрите в исходниках ядра Linux файл fs/open.c. В данную программу не включаются файлы sys/stat.h и sys/types.h, поскольку мы не пользуемся ни константами режима, ни типом mode_t. Заголовочный файл unistd.h нужен для системного вызова close о, о котором пойдет речь в следующем разделе.
Related Articles
Set as favorite
Bookmark
Email This
Hits: 312 Комментарии (0)RSS feed CommentsНаписать комментарий |