Содержание
Задание
Теоретическая часть
Краткое описание программы
Код программы
Скриншоты
Выводы
Задание
Написать программу, которая обеспечивает работу команды вида: [имя_команды] [-a |-b] [-o исходный файл], где-a и-b несовместимые флаги. • если задан флаг-a - команда отображает имя домашнего директории, в котором пользователь оказывается после входа в систему; • если задан флаг-b - имя терминала. Полученная информация также записывается в файл, имя которого задается как аргумент опции-o.
Теоретическая часть Открытие и создание файла.
При работе с файлами, не являющимися стандартными потоками ввода, вывода и ошибок, необходимо открыть их явным образом, чтобы иметь возможность читать и записывать. Для этого существуют системный вызов open().
#include <fcntl.h.>
#include<sys/types.h
#include<sys/stat.h>
int open(char *filename, int flags, [mode_t mode]);
char *filename – символьная строка , содержащая имя открываемого файла (путь к нему).
int flags – указывает способ открытия файла.
[mode_t mode] – необязательный параметр режима доступа для создаваемого файла. Обычно для задания прав доступа к файлу используют восьмеричную систему представления прав доступа. Но в POSIX также есть следующий набор констант, которые можно объединять в аргументе mode_t mode, применяя к ним операцию бинарного или:
S_IRWXU – у владельца есть разрешение на чтение, запись и выполнение;
S_IRUSR – у владельца есть разрешение на чтение;
S_IWUSR – у владельца есть разрешение на запись;
S_IXUSR – у владельца есть разрешение на выполнение;
S_IRWXG – у группы есть разрешение на чтение, запись и выполнение;
и тому подобные.
Эти константы режима файла объявлены в заголовочном файле sys/stat.h. Поэтому для их использования необходимо его подключить.
Особенность open() – возможность установки флагов открытия файла, благодаря которым процесс открытия файла становится контролируемым.
Флаги открытия файла представляют собой набор символических констант, которые могут соединяться операцией побитового или (||). Чтобы использовать эти флаги и системный вызов open(), в программу необходимо включить заголовочный файл fcntl.h.
Основные флаги для системного вызова open(), объявленные в заголовочном файле fcntl.h:
O_RDONLY – открыть файл только для чтения;
O_WRONLY – открыть файл только для записи;
O_RDWR – открыть файл для чтения и записи;
O_CREAT – создать файл, если он не существует;
O_TRUNC – очистить файл, если он существует. То есть файл усекается до нулевой длины;
O_APPEND – дописать в существующий файл. Перед каждой записью указатель позиции в файле устанавливается на конец файла, тем самым позволяя дописать в файл. Все данные будут записаны в конец файла, даже если текущее смещение было восстановлено с помощью lseek();
O_EXCL – не открывать файл, если он существует (используется с флагом O_CREATE)
O_NONBLOCK – открыть файл в неблокируемом режиме, если это возможно. То есть считается столько байт, сколько есть. Если флаг не установлен – процесс чтения переходит в состояние ожидания необходимого количества информации.
Следует отметить, что некоторые флаги не могут объединяться между собой. Здесь нужно рассуждать логически. Нельзя, например, соединить флаги O_RDONLY и O_WRONLY, поскольку они противоречат друг другу.
Возвращаемое open() значение является либо новым дескриптором файла, либо -1, означающим ошибку, в этом случае для переменной errno будет установлено подходящее значение ошибки.