Чтение онлайн

на главную - закладки

Жанры

Основы программирования в Linux
Шрифт:

Ошибки потока

Для обозначения ошибок многие функции библиотеки stdio применяют значения за пределами допустимых, например, пустые указатели или константу

EOF
. В этих случаях ошибка указывается во внешней переменной
errno
.

#include <errno.h>

extern int errno;

Примечание

Имейте в виду, что многие функции могут изменять значение

errno
.
Оно достоверно, только когда функция закончилась неудачно. Вам следует проверять это значение сразу же, как функция сообщила о сбое. Прежде чем использовать его, скопируйте это значение в другую переменную, поскольку функции вывода, такие как
fprintf
, могут сами изменять
errno
.

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

#include <stdio.h>

int ferror(FILE *stream);

int feof(FILE *stream);

void clearerr(FILE *stream);

Функция

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

Функция

feof
проверяет индикатор конца файла в потоке и возвращает ненулевое значение, если индикатор установлен, или ноль в противном случае. Применяйте ее следующим образом:

if (feof(some_stream))

 /* Мы в конце */

Функция

clearerr
очищает индикаторы конца файла и ошибки для потока, на который указывает параметр
stream
. Она не возвращает никакого значения, и для нее не определены никакие ошибки. Вы можете применять эту функцию для сброса состояния ошибки в потоках. Примером может быть возобновление записи в поток после разрешения проблемы, связанной с ошибкой "disk full" (диск заполнен).

Потоки и дескрипторы файлов

Каждый файловый поток ассоциирован с низкоуровневым дескриптором файла. Вы можете смешивать операции низкоуровневого ввода/вывода с высокоуровневыми потоковыми операциями, но это, как правило, неразумно, потому что трудно предсказать эффект от применения буферизации.

#include <stdio.h>

int fileno(FILE *stream);

FILE *fdopen(int fildes, const char *mode);

Вы можете определить, какой низкоуровневый дескриптор файла применяется для файлового потока, вызвав функцию

fileno
. Она возвращает дескриптор файла для заданного потока или -1 в случае сбоя. Эта функция полезна при необходимости низкоуровневого доступа к открытому потоку, например для вызова функции
fstat
применительно к этому потоку.

Можно создать новый поток файла на основе дескриптора файла, открытого только для чтения, применив функцию

fdopen
. По существу, эта функция предоставляет буферы stdio для уже открытого файлового дескриптора, это может быть самый легкий вариант объяснения ее назначения.

Функция

fdopen
действует так же, как функция
fopen
, но в отличие от имени файла она принимает в качестве параметра низкоуровневый дескриптор файла. Это может пригодиться, если вы используете вызов open для создания файла, может быть для более тонкого управления правами доступа, но хотите применить поток для записи в файл. Параметр mode такой же, как у функции
fopen
и должен быть совместим с режимами доступа к файлу, установленными при первоначальном открытии файла. Функция
fdopen
возвращает новый файловый поток или
NULL
в случае неудачного завершения.

Ведение файлов и каталогов

Стандартные библиотеки и системные вызовы обеспечивают полный контроль над созданием и ведением файлов и каталогов.

chmod

С помощью системного вызова

chmod
вы можете изменять права доступа к файлу или каталогу. Он лежит в основе программы командной оболочки
chmod
.

Далее приведена синтаксическая запись вызова:

#include <sys/stat.h>

int chmod(const char *path, mode_t mode);

Права доступа к файлу, заданному параметром

path
, изменяются в соответствии со значением параметра
mode
. Режим файла
mode
задается как в системном вызове open с помощью поразрядной операции
OR
, формирующей требуемые права доступа. Если программе не даны соответствующие полномочия, только владелец файла и суперпользователь могут изменять права доступа к файлу.

chown

Суперпользователь может изменить владельца файла с помощью системного вызова chown.

#include <sys/types.h> #include <unistd.h>

int chown(const char *path, uid_t owner, gid_t group);
 

В вызове применяются числовые значения идентификаторов (ID) нового пользователя и группы (взятые из системных вызовов

getuid
и
getgid
) и системная величина, используемая для ограничения пользователей, имеющих разрешение изменять владельца файла. Владелец и группа файла изменяются, если заданы соответствующие полномочия.

Примечание

Стандарт POSIX в действительности допускает существование систем, в которых несуперпользователи могут изменять права владения файлом. Все "правильные" с точки зрения POSIX системы не допускают этого, но строго говоря, это расширение стандарта (в FIPS 151-2). Все виды систем, с которыми мы имеем дело в этой книге, подчиняются спецификации XSI (X/Open System Interface) и соблюдают на деле правила владения.

unlink, link и symlink

Поделиться:
Популярные книги

Двадцать и двадцать один. Наивность

Das_Leben
Детективы:
триллеры
5.00
рейтинг книги
Двадцать и двадцать один. Наивность

Елизавета Петровна

Сахаров Андрей Николаевич
11. Романовы. Династия в романах
Проза:
историческая проза
5.50
рейтинг книги
Елизавета Петровна

Егерь. Вызов

Скиба Николай
3. Зверолов
Фантастика:
боевая фантастика
рпг
уся
фэнтези
попаданцы
6.00
рейтинг книги
Егерь. Вызов

Том 1. Романы. Рассказы. Критика

Газданов Гайто
1. Собрание сочинений в пяти томах
Проза:
русская классическая проза
5.00
рейтинг книги
Том 1. Романы. Рассказы. Критика

Война и мир. Первый вариант романа

Толстой Лев Николаевич
Проза:
русская классическая проза
5.25
рейтинг книги
Война и мир. Первый вариант романа

Волхв

Фаулз Джон Роберт
Проза:
современная проза
8.14
рейтинг книги
Волхв

В осаде

Кетлинская Вера Казимировна
Проза:
военная проза
советская классическая проза
5.00
рейтинг книги
В осаде

Всё о современной рыбалке. Полная энциклопедия

Горяйнов Алексей Георгиевич
Дом и Семья:
хобби и ремесла
5.00
рейтинг книги
Всё о современной рыбалке. Полная энциклопедия

Король планеты Зима (сборник)

Ле Гуин Урсула Кребер
9. Вся Ле Гуин
Фантастика:
фэнтези
8.42
рейтинг книги
Король планеты Зима (сборник)

Засеянные звезды. Сборник фантастических романов

Блиш Джеймс Бенджамин
13. «Клуб Любителей Фантастики»
Фантастика:
научная фантастика
6.25
рейтинг книги
Засеянные звезды. Сборник фантастических романов

Особый склад ума

Катценбах Джон
Детективы:
триллеры
7.33
рейтинг книги
Особый склад ума

Золушка (сборник)

Макбейн Эд
Мастера остросюжетного романа
Детективы:
полицейские детективы
5.00
рейтинг книги
Золушка (сборник)

Свет погасших звезд. Люди, которые всегда с нами

Раззаков Федор Ибатович
2. Свет погасших звезд
Документальная литература:
биографии и мемуары
5.00
рейтинг книги
Свет погасших звезд. Люди, которые всегда с нами

Бояръ-Аниме. Газлайтер. Том 32

Володин Григорий Григорьевич
32. История Телепата
Фантастика:
альтернативная история
аниме
фэнтези
попаданцы
6.40
рейтинг книги
Бояръ-Аниме. Газлайтер. Том 32