КУРСОВА РОБОТА
з дисципліни
"UNIX"
Виконав: студент гр. ІН.сз-31
Безпалько Є.В.
Перевірив: Бабий М.С.
Варіант № 2
Суми 2014
Содержание:
1. Задание 1.................................................................................................................................................. 3
2. Задание 2.................................................................................................................................................. 6
Список литературы:.................................................................................................................................... 9
Задание 1
Написать программу на языке C++ для компилятора g++ системы UNIX, которая бы поддерживала следующие режимы:
- создание в домашнем каталоге файла с именем list и занесение в него нескольких записей следующего содержания: наименование компьютерной техники – строковый тип, количество – целый тип, цена – вещественный тип;
- найти в файле list компьютерное устройство с наиболее высокой ценой;
- Создать новый файл list1 из записей файла list, наименование техники в которых начинается с символа “К”.
При работе с файлами использовать файловые дескрипторы.
Основные файловые функции Unix
Для работы с файловой системой используются следующие функции:
int open (const char* path, int accesmode, int permission) - прототип функции находится в fcntl.h, path - путь, permission обычно 0.
Флаги режима доступа: О_RDONLY - для чтения, О_WRONLY - для записи, O_RDWR — для чтения и записи.
Существует также модификатор доступа, например O_CREAT - если файл не существует, он создается. Функция возвращает дескриптор файла или -1 при ошибке.
int create (const char* path, int accesmode) - упрощенный вариант создания файла.
long read (int fdesc, void* buf, int size) - читается блок данных из файла.
Прототип находится в unistd.h, fdesc - файловый дескриптор, buf - адрес буфера, содержащего прочитанные данные, size - количество байтов, которое нужно прочитать из файла. Функция возвращает количество прочитанных байтов.
long write (int fdesc, const void* buf, int size) - записывает блок данных в файл.
Прототип - в unistd.h, параметры как в read. Функция возвращает количество байтов, успешно записанных в файл.
long lseek (int fdesc, long pos, int whence) - изменяет текущую позицию указателя чтения-записи в файле. Прототип - в unistd.h, pos - задает смещение в байтах, которое должно быть прибавлено к базовому адресу для получения нового смещения. Параметр whence задает базовый адрес: SEEK_CUR - текущий адрес указателя в файле; SEEK_SET - начало файла; SEEK_END - конец файла. Функция возвращает смещение.
Код программы
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <fcntl.h>
#include <string.h>
#define N 5
struct TComp
{
char* name[15];
int count;
float price;
} Comp, fcomp;
char* fname="list";
void make_file()
{
int f=open(fname, O_WRONLY|O_CREAT,0);
if (f==-1)
{
perror("Ошибка открытия файла");
exit (1);
}
for(int i=0; i<N; i++)
{
puts ("Введите наименование: ");
scanf("%s",&Comp.name);
puts("Введите количество и цену: ");
scanf("%i %f", &Comp.count, &Comp.price);
write(f, &Comp, sizeof(Comp));
printf("name=%s; count=%i; price=%f;\n", Comp.name, Comp.count, Comp.price);
}
close(f);
}
void max_price()
{
fcomp.price = 0;
int f1 = open(fname, O_RDONLY, 0);
if (f1==-1)
{
perror("Ошибка открытия файла");
exit (1);
}
while (read(f1, &Comp, sizeof(Comp)))
{
if (Comp.price > fcomp.price)
{
fcomp.name = Comp.name;
fcomp.count = Comp.count;
fcomp.price = Comp.price;
}
printf("%s price is %f.\n", Comp.name, Comp.price);
}
printf("Computer %s has maximum price of %f", fcomp.name, fcomp.price);
close(f1);
}
void prosmotr()
{
int f2=open(fname, O_RDONLY,0);
if (f2==-1)
{
perror("Ошибка открытия файла");
exit (1);
}
while (read(f2, &Comp, sizeof(Comp)))
{
printf("name=%s; count=%i; price=%f;\n", Comp.name, Comp.count, Comp.price);
}
close(f2);
}
void main()
{
int option;
puts("Выберите режим: ");
puts("1-создание файла; 2-поиск устройства с макс. ценой; 3-просмотр файла:");
scanf("%i", &option);
switch(option)
{
case 1: make_file(); break;
case 2: max_price(); break;
case 3: prosmotr(); break;
}
}
Задание 2
Написать клиентскую и серверную программы для обмена информацией через сокеты. При этом клиентская и серверная программы должны быть установлены на разных компьютерах и выполнять следующие действия:
- Клиент передает серверу строку символов.
- Сервер получает строку от клиента, запускает новый процесс и передает ему через неименованный программный канал полученную строку. Запущенный процесс подсчитывает количество символов в строке и выводит результат на экран.
Межмашинное соединение с помощью сокетов
Межмашинное соединение чаще всего реализуется с помощью сокетов.
Различают сокеты с установлением соединения и без установления соединения. В зависимости от того, к какому домену принадлежит гнездо, используются разные форматы адресов сокетов и базовые транспортные протоколы. При использовании сокетов используются следующие стандартные домены: AF_UNIX (формат адреса - путевое имя Unix) и AF_INET (формат адреса - хост-имя и номер порта).
Для каждого гнезда назначается тип, посредством которого определяется способ передачи данных между двумя сокетами. Если тип сокета - виртуальный канал, то данные передаются последовательно, с достаточной степенью надежности и не дублируются. Если тип сокета - дейтаграмма, то условие последовательности пересылки данных не выполняется и надежность их передачи низкая. Тип гнезда с установлением соединения - как правило, виртуальный канал, а тип гнезда без установления соединения — дейтаграмма. Дейтаграммные сокеты обычно работают быстрее, чем виртуальные каналы, и используются в приложениях, где быстродействие важнее, чем надежность.
Сокет каждого типа поддерживает один или несколько протоколов, однако в любой Unix-системе для любого сокета всегда указывается протокол по умолчанию. Протокол по умолчанию для виртуального канала - TCP, а для дейтаграммы -UDP.