- •Исследование системных вызовов для работы с файлами
- •Содержание
- •1. Цель работы
- •2. Краткие теоретические сведения
- •2.1. Cистемные вызовы
- •2.1.1. Открытие файла, системный вызов open
- •2.1.4. Создание файла, системный вызов creat
- •2.1.2. Чтение файла, системный вызов read
- •2.1.2. Запись в файл, системный вызов write
- •2.1.3. Закрытие файла, системный вызов close
- •2.2. Ошибки при выполнении системных вызовов
- •2.3. Генерация случайных чисел
- •2.4. Пример программы
- •3. Задания на лабораторную работу
- •4. ТехническиЕ средствА для выполнения работы
- •5. Порядок выполнения лабораторной работы
- •6. Содержание отчета о выполнении лабораторной работы
- •7. Порядок защиты работы
- •8. Контрольные вопросы
- •Библиографический список
- •Приложение а (справочное) Текст программы
- •Приложение б (справочное) Результат работы программы
4. ТехническиЕ средствА для выполнения работы
Компьютерный класс с установленными ОС WINDOWS и виртуальными машинами позволяющими запускать ОС Linux.
5. Порядок выполнения лабораторной работы
Произвести загрузку операционной системы.
Создать папку e:\VM\Share.
Создать текстовый файл, содержащий программу приведенную в приложении А и сохранить его в папку e:\VM\Share.
Произвести запуск виртуальной машины и загрузку в ней операционной системы LINUX.
Произвести регистрацию с именем пользователя и паролем, указанным преподавателем.
В меню «Устройства» виртуальной машины выбрать пункт «Общие папки» и добавить папку e:\VM\Share.
В командной строке Linux ввести команду для перехода в режим суперпользователя (su, пароль: user).
Произвести монтирование папки mount –t vboxsf share /mnt/share .
Выйти из режима суперпользователя exit.
Перенести текстовый файл с программой из папки /mnt/share в папку user.
Переименовать текстовый файл с программой в файл с расширением с.
Откомпилировать программу с помощью gcc (gcc имя.c -o имя).
Произвести запуск программы (./имя -p)
Ввести исходные данные и получить слово состояния устройства.
Создать и отладить программу, соответствующую варианту задания.
6. Содержание отчета о выполнении лабораторной работы
Отчёт должен содержать:
- титульный лист;
- цель лабораторной работы;
- задание соответствующее варианту;
- текст программы;
- результаты работы программы;
- выводы.
Отчёт по лабораторной работе должен быть выполнен в соответствии требованиями ДСТУ.
7. Порядок защиты работы
Защита производится при наличии отчета за компьютером и состоит в демонстрации работы программы в соответствии с вариантом задания.
8. Контрольные вопросы
1. Что такое системный вызов?
2. Какие системные вызовы служат для открытия файла? Что такое дескриптор файла?
3. Как формируются права доступа к создаваемому файлу?
4. С помощью каких системных вызовов можно организовать запись в файл, чтение из файла? Какие возможны ошибочные ситуации при использовании этих системных вызовов?
5. Какая функция служит для обработки ошибок системных вызовов?
6. Для чего предназначены параметры функции main(int argc, char *argv[])?
7. Для чего предназначена функция atoi()?
8. Как сгенерировать случайное число в диапазоне от 0 до 255?
Библиографический список
Белецкий Я. Энциклопедия языка Си / Я. Белецкий, пер. с пол. А. Д. Плитман, ред. Ф. Ф. Пащенко. - М.: Мир, 1992. - 686 c.
Бондаренко М. Ф. Системное программирование в современных операционных системах: учебное пособие для студентов вузов / М. Ф. Бондаренко [и др.]. - Харьков: Компания СМИТ, 2005. - 432 с.
Бек Л. Введение в системное программирование / Л. Л. Бек; Ред. Л. Н. Королев, Пер. с англ. Н. А. Богомолов. - М.: Мир, 1988. - 448 с.
Приложение а (справочное) Текст программы
/*
*Программа, предназначенная для формирования и записи в файл
*наборов неупакованных чисел, содержащих информацию о состоянии
*устройства.
*опция -g генерация и запись файла
*опция -r чтение из файла
*/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>
#include <fcntl.h>
#define FILERIGHTS 0644 /* права доступа для файла */
void generator(char *, int);
void reader(char *);
void myerror(char *); /*функция обработки ошибок системных вызовов*/
int main(int argc, char * argv[])
{
if (argc < 3|| argc > 4)
{
fprintf(stderr,"ошибка вызова %s\n",argv[0]);
fprintf(stderr,"вызов: \n");
fprintf(stderr,"генерация и запись файла: %s -g целевой_файл количество_наборов_чисел\n",argv[0]);
fprintf(stderr,"чтение: %s -r исходный_файл\n",argv[0]);
exit(1);
}
else
{
switch(argv[1][1])
{
case 'g': generator(argv[2], atoi(argv[3])); break;
case 'r': reader(argv[2]); break;
default : printf("некорректная опция\n");
}
}
return 0;
}
void generator(char * fnameout, int n)
{
int i;
int fdout; /* дескриптор файла */
unsigned short mas[4]; /* массив для генерируемого набора чисел */
int nmas = sizeof mas; /* количество байт, занимаемых массивом */
int nw; /* количество байт, фактически записанных в файл */
/*создание файла*/
if((fdout = creat(fnameout,FILERIGHTS))<0)
{
myerror("generator: ошибка создания файла");
}
/*генерация и запись n наборов*/
for (i=1; i <= n; i++)
{
/*генерация*/
mas[0] = (unsigned short)rand()%32; /* код состояния (0 - 31)*/
mas[1] = (unsigned short)rand()%2; /* признак ошибки (0 - 1)*/
mas[2] = (unsigned short)rand()%2; /*признак занятости (0 - 1)*/
mas[3] = (unsigned short)rand()%256; /* количество байт (0 - 255)*/
/*вывод на экран*/
printf("сгенерирован %d-набор:\n",i);
printf("код состояния %hu\n", mas[0]);
printf("признак ошибки %hu\n", mas[1]);
printf("признак занятости %hu\n", mas[2]);
printf("количество байт %hu\n", mas[3]);
/*вывод в файл*/
if((nw = write(fdout, mas, nmas)) != nmas)
{
myerror("generator: ошибка записи ");
}
}
/*закрытие файла*/
if ( close(fdout) == -1)
{
myerror("generator: ошибка закрытия файла ");
}
}
void reader(char *fnamein)
{
int fdin; /*файловый дескриптор*/
unsigned short mas[4];
int nmas = sizeof mas; /*размер блока в байтах*/
int nr; /*количество фактически прочитанных байт*/
int i;
/*открытие файла*/
if ((fdin = open(fnamein, O_RDONLY))<0)
{
myerror("reader: ошибка открытия файла");
}
i = 1;
/*чтение из файла данных порциями по nmas байт*/
while ((nr = read(fdin, mas, nmas)) == nmas)
{
printf("Прочитан %d-набор:\n",i);
printf("код состояния %hu\n", mas[0]);
printf("признак ошибки %hu\n", mas[1]);
printf("признак занятости %hu\n", mas[2]);
printf("количество байт %hu\n", mas[3]);
i += 1;
}
if (nr < 0)
{
myerror("reader: ошибка чтения");
}
/* закрытие файла */
if (close(fdin) == -1)
{
myerror("reader: ошибка закрытия файла");
}
}
void myerror(char * st)
{
perror(st);
exit(1);
}
