- •Исследование системных вызовов для работы с файлами
- •Содержание
- •1. Цель работы
- •2. Краткие теоретические сведения
- •2.1. Cистемные вызовы
- •2.1.1. Открытие файла, системный вызов open
- •2.1.2. Чтение файла, системный вызов read
- •2.1.2. Запись в файл, системный вызов write
- •2.1.3. Закрытие файла, системный вызов close
- •2.1.4. Создание файла, системный вызов creat
- •2.2. Ошибки при выполнении системных вызовов
- •2.3. Генерация случайных чисел
- •2.4. Пример программы
- •3. Задания на лабораторную работу
- •4. ТехническиЕ средствА для выполнения работы
- •5. Порядок выполнения лабораторной работы
- •6. Содержание отчета о выполнении лабораторной работы
- •7. Порядок защиты работы
- •8. Контрольные вопросы
- •Библиографический список
- •Приложение а (справочное) Текст программы
- •Приложение б (справочное) Результат работы программы
2.2. Ошибки при выполнении системных вызовов
Ядро оповещает вашу программу при возникновении ошибки с помощью определенного кода ошибки.
На рисунке 6 показан вызов функции perror которая узнает у ядра код ошибки и выводит в соответствии с возникшей стандартной ошибкой строку, которую вы ей передаете, вместе с кратким сообщением об ошибке.
#include <stdio.h>
void perror(char *s);
Пример:
if ((file = open(DB_PATH,
O_RDONLY))<0)
{
perror(«не удается
открыть файл базы данных»);
}
Выведется:
не удается открыть
файл базы данных: No such file or directory
Рисунок 6 – Использование функции perror
Код ошибки записывается в переменную errno из <errno.h>. Это переменная типа int, значение которой устанавливается равным положительному номеру ошибки различными библиотечными функциями.
2.3. Генерация случайных чисел
Функция rand() генерирует псевдослучайное целое число в диапазоне от нуля до значения RAND_MAX. RAND_MAX –это константа, которая определена в <stdlib.h>.
Диапазон значений, непосредственно генерируемых rand, часто отличается от того, который необходим в конкретном приложении. Если вы хотите получить целое число из интервала [A..B], то используйте соотношение
int x = A + rand() % (B+1-A).
Например, чтобы получить целое число в диапазоне от минус100 до 100, нужно вычислить x = -100+ rand() % 201.
В результате вычисления выражения rand() % 201, то есть взятия остатка от деления на 201, получим целое число в диапазоне от 0 до 200. Это называется масштабированием. После этого сдвигаем диапазон генерируемых случайных чисел, отнимая 100 от предыдущего результата. Получается целое число в диапазоне от минус 100 до 100.
На рисунке 7 приведен в качестве примера фрагмент программы, моделирующий 10 бросков шестигранной игральной кости.
for
(i = 1; i <= 20; i++) printf(“%4d”,
1+ rand()%6 );
Рисунок 7 – Моделирование 10 бросков шестигранной игральной кости
При каждом вызове такой программы последовательность чисел будет повторяться. Чтобы получать разные последовательности следует задавать некий начальный параметр последовательности (это называется «рандомизация») при помощи функции srand( число ).
Для рандомизации часто используется функция time() которая определяет текущее календарное время в секундах. То есть компьютер считывает показания внутренних часов, чтобы автоматически получить не определенное заранее значение
srand(time(NULL)).
2.4. Пример программы
Устройство сообщает о своем состоянии с помощью нескольких чисел.
Состояние устройства представляется в виде кода состояния (C – число в диапазоне от 0 до 31), признака ошибки (F – 1/0), признака занятости (B – 0/1), количества байт, переданных в последней операции (N – число в диапазоне от 0 до 255).
Эти числа объединяются в одно слово состояния устройства, формируемое способом представленным в таблице 1.
Таблица 1 – Слово состояния устройства
№ разряда |
15 |
14 |
13 |
12 |
11 |
10 |
09 |
08 |
07 |
06 |
05 |
04 |
03 |
02 |
01 |
00 |
значение |
C |
C |
C |
C |
C |
0 |
F |
B |
N |
N |
N |
N |
N |
N |
N |
N |
Программа должна вызывает функцию генерации и записи файла упаковки при указании опции -g в командной строке, а функцию чтение из файла – при указании опции -r.
Полный текст программы приведен в приложении А. Результат вызова программы приведен в приложении Б.