- •050201 «Системная инженерия»
- •1. Цель работы
- •2. Постановка задачи
- •3. Краткие теоретические сведения
- •3.1. Системные вызовы
- •3.1.1. 6Открытие файла: Системный вызов open
- •3.1.2. Чтение данных из файла: системный вызов read
- •3.1.3. Запись в файл: системный вызов write
- •3.1.4. Закрытие файла: системный вызов close
- •3.1.5. Создание файла: системный вызов creat
- •3.2. Ошибки при выполнении системных вызовов
- •3.3. Генерация случайных чисел
- •4. Пример программы
- •5. Контрольные вопросы
- •Приложение а (справочное) Текст программы
Приложение а (справочное) Текст программы
/*
*Программа, предназначенная для формирования и записи в файл
*наборов неупакованных чисел, содержащих информацию о состоянии
*устройства.
*опция -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);
}