Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Метод_ПСРВ.doc
Скачиваний:
26
Добавлен:
12.02.2016
Размер:
1.6 Mб
Скачать

2. Упражнения

УПРАЖНЕНИЕ 2.1.

Выполните рассмотренную последовательность действий.

УПРАЖНЕНИЕ 2.2.

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

УПРАЖНЕНИЕ 2.3.

Проверьте следующие возможности.

Указать фоновое задание в оболочке Korn можно несколькими путями. На задание можно сослаться по ИД любого его процесса, или одним из следующих способов:

%Номер

Указывает на задание с конкретным номером.

%Строка

Указывает на задание, командная строка которого начинается со Строки.

%?Строка

Указывает на задание, командная строка которого содержит Строку.

%%

Указывает на текущее задание.

%+

Эквивалентно %%.

%-

Указывает на предыдущее задание.

3. Содержание отчёта

  1. Номер, название и цель практической работы.

  2. Краткое описание действий и анализ результатов выполненной работы (упражнения 2.1 – 2.3).

  3. Выводы, содержащие оценку наличия (или отсутствия) ограничений на количество фоновых работ и работ переднего плана. А так же ограничения на ввод и вывод информации для фоновых работ.

ПРАКТИЧЕСКОЕ ЗАНЯТИЕ №14

Запись и чтение информации из/в файл

Цель – изучение системных вызовов для записи и чтения информации из/в файл

1. Краткие теоретические сведения

1.1. Функции базового ввода/вывода

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

1.2. Открытие файла

Для открытия или создания файла используется функция:

#include <sys/types.h>

#include <sys/stat.h>

#include <fcntl.h>

int open(const char *path, int oflag [,mode_t mode]);

Функции open()позволяют процессу открыть файл (устройство), имя которого указано в path. Это имя может быть как абсолютным (полным, начинающимся с корневого каталога /), так и относительным (указанным относительно текущего каталога). Для открытого файла создается новый дескриптор, который не разделяется с каким-либо другим процессом в системе. Режим доступа к открытому файлу устанавливается согласно значению флагов, сформированных в разрядах аргумента oflag.

Значение oflag является целым значением и строится с использованием операции поразрядного "ИЛИ" над значениями флагов, символические константы для которых определены в заголовочном файле <fcntl.h>. Флаги позволяют определить режим открытия и доступа к существующему или вновь создаваемому файлу, а также уточнить реализацию выбранного режима доступа. Значения и семантика флагов следующая:

O_RDONLY -           открыть существующий файл только для чтения;

O_RDWR -      открыть для чтения и записи;

O_WRONLY -открыть только для записи.

Выбранный режим доступа к открываемому файлу уточняется флагами:

O_APPEND - если этот флаг установлен, то для режимов, допускающих запись в файл (O_RDWR и O_WRONLY), перед каждой операцией записи указатель файла будет устанавливаться в конец этого файла.

O_DSYNC - если этот флаг установлен, то каждый запрос write() будет ждать, пока все данные не будут успешно записаны. То есть все записи в файл, а также соответствующие им изменения в метаданных файла будут сохранены на внешнем носителе.

O_RSYNC - если этот флаг установлен, то каждый запрос read() завершается только тогда, когда данные успешно прочитаны.

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

O_CREAT - установка этого флага указывает, что если открываемый файл с указанным именем не существует, то необходимо создать новый файл и открыть его для записи. Если файл с указанным именем уже существует, то будет ли открыт этот файл, или создан новый файл для записи, или функция open() завершится с ошибкой определяется значением флага O_EXCL.

O_EXCL - флаг используется совместно с O_CREAT. При его установке новый файл будет создан только в том случае, если файл с указанным именем не существует и это же действие с тем же именем файла в данный момент не выполняется другими процессам. В противном случае возвращается ошибка создания файла. Если флаг не установлен, то при наличии файла с указанным именем флаг O_CREAT игнорируется и открывается существующий файл. Флаг O_EXCL без O_CREAT также игнорируется.

O_NONBLOCK - если этот флаг установлен, то функция open() завершается без ожидания, когда устройство будет готовым или доступным. Последующее поведение устройства определяется его спецификой. Если флаг очищен, то функция open() ждет, прежде чем завершиться, когда устройство будет готовым или доступным. Готовность устройства определяется его спецификой. В некоторых случаях реакция на флаг не определена.

O_TRUNC - если файл существует, является обычным файлом и он успешно открыт в режиме O_WRONLY или O_RDWR, то длина файла усекается до нуля, а права доступа и владелец оставлены неизменными. Флаг не имеет никакого эффекта для файлов устройств или каталогов. Если файл открывается как O_RDONLY, флаг O_TRUNC игнорируется.

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

Значение mode является целым значением и строится с использованием операции поразрядного "ИЛИ" над значениями флагов, специфицирующих права доступа к вновь создаваемому файлу.

Устанавливаемые права доступа и дополнительные атрибуты файла определяются следующими символическими значениями флагов (определены в заголовочном файле <sys/stat.h>):

Флаг

Значение

S_IRWXU

Установить право на чтение, запись и выполнение для владельца

S_IRUSR

Установить право на чтение для владельца

S_IWUSR

Установить право на запись для владельца

S_IXUSR

Установить право на выполнение для владельца

S_IRWXG

Установить право на чтение, запись и выполнение для группы

S_IRGRP

Установить право на чтение для группы

S_IWGRP

Установить право на запись для группы

S_IXGRP

Установить право на выполнение для группы

S_IRWXO

Установить право на чтение, запись и выполнение для остальных

S_IROTH

Установить право на чтение для остальных

S_IWOTH

Установить право на запись для остальных

S_IXOTH

Установить право на выполнение для остальных

В результате выполнения функция open() возвращает неотрицательное целое число (дескриптор файла), представляющее наименьшее значение неиспользуемого дескриптора файла. Для файла с прямым доступом указатель файла установлен в начало. В случае ошибки, возвращается -1 и устанавливается errno.

Замечание. При запуске программы для неё автоматически создаются три дескриптора: стандартный ввод – 0, стандартный вывод – 1, стандартный вывод сообщений об ошибках – 2.

Частным случаем функции open() является функция:

#include <fcntl.h>

int creat(const char *pathname, mode_t mode]);

Эта функция создает и открывает новый файл с именем, указанным в pathname, и правами доступа, заданными в mode. Она эквивалентна вызову:

open("myfile.dat",O_WRONLY|O_CREAT|O_TRUNC,mode);

При успешном выполнении функция creat() возвращает дескриптор файла, в случае ошибки возвращается -1 и устанавливает errno.

Пример:

#include <sys/types.h>

#include <sys/stat.h>

#include <fcntl.h>

#include <stdlib.h>

 

int main( void ) {

int fd;

 

/* создать и открыть файл для записи*/

/* заменить существующий файл*/

/* создать с правами чтения/записи для владельца */

 

fd=open("myfile.dat",O_WRONLY|O_CREAT|O_TRUNC,S_IRUSR|S_IWUSR);

 

/* открыть существующий файл для чтения */

 

fd = open("myfile.dat", O_RDONLY);

 

/* открыть существующий файл для дозаписи или создать новый файл для записи, если такой файл не существует, с правами доступа на чтение/запись для всех*/

 

fd = open("myfile.dat", O_WRONLY|O_CREAT|O_APPEND, S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH);

returnEXIT_SUCCESS;

}