О. С. Попова Хіхловська І. В. Системне та прикладне програмне забезпечення у телекомунікаціях Конспект
Вид материала | Конспект |
Размер канала Функции к разделу FIFO Функция fcntl(2) Функция printf Системный вызов write – Функция pipe(2) Клиент посылает серверу сообщенияHello, а сервер выводит это сообщение на терминал. |
- Прикладне програмне забезпечення, 279.39kb.
- Робоча навчальна програма навчальної дисципліни " Системне програмне забезпечення", 184.72kb.
- Урок №6 Тема «Ознайомлення з операційною системою», 50.71kb.
- Необхідні обов’язкові попередні та супутні модулі, 31.66kb.
- Робоча программа методичні вказівки І індивідуальні завдання до вивчення дисципліни, 1120.73kb.
- Лекція 4 "Інформатика та комп'ютерна техніка" Тема Системне програмне забезпечення, 99.46kb.
- Опис кредитного модуля (дисципліни), 122.49kb.
- Ютерна інженерія" Галузь знань: 0501 "Інформатика та обчислювальна техніка", 113.29kb.
- О. С., Хіхловська І. В. Обчислювальна техніка та мікропроцесори посібник з дисципліни, 294.81kb.
- Методика ознайомлення учнів з основними можливостями електронних таблиць на уроках, 286.55kb.
Размер канала
В канале может находиться только определенное число байтов, прежде чем следующий вызов write будет заблокирован. Минимальный размер, определенный POSIK равен 512 байтов. Вызов write выполняется для канала неделимыми порциями и запись выполняется ядром за одну непрерывную операцию. Родительский выполняется в бесконечном цикле, а дочерний посылает сообщение родительскому, спрашивая канал и проверяя, поступили ли данные. Системный вызов fcntl устанавливает флаги F_SETFL и O_NONBLOCK
Функции к разделу FIFO
- Функция pipe(2) (создание канала)
Функция pipe(2) служит для создания однонаправленного (симплексного) канала (анонимного) обмена данными между двумя родственными процессами, т.к. только они имеют возможность получить доступ к одному и тому же каналу. После завершения работы канал уничтожается.
Функция имеет вид:
# include
int pipe (int fildes[2]);
Функция возвращает два fd в массиве [ ], причем fildes[0] служит для чтения данных из канала, а fildes[1] для записи данных в канал.
- Функция fcntl(2) ( управление файловыми операциями в уже открытых файлах, заданных дескриптором файла filedes)
# include
int fcntl (int fildes, int cnd,…) – установка и снятие блокировки на файл его часть, создание каналов FIFO.
Функция fcntl(2) выполняет действие cmd с файлом , а третий аргумент зависит от конкретного действия:
а). F_SETLK – установить блокирование записи файла. Структура flock описывает блокирование, и указатель на нее передается в качестве третьего аргумента. При невозможности блокирования fcntl(2) возвращается с ошибкой EACCESS или EAGAIN;
б)F_SETLKW – аналогично предыдущему, но при невозможности блокирования по причине уже существующих блокировок, процесс переходит в состояние сна, ожидая снятие блокировок.
W – ждать;
в). F_SETFL – задает режим записи данных в конец файла.
- Функция printf – запись в стандартный вывод, форматизованный
- Системный вызов unlink(2) удаляет файл, например, unlink(/tmp/usedfile).
Вызов возвращает 0 в случае успешного завершения и – 1 – в случае ошибки.
- Системный вызов read копирует произвольное число символов или байтов из файла в буфер ( в ASCII)
- Системный вызов open открывает файл для чтения, записи или создает пустой файл.
- Системный вызов close – закрывает файл, возвращает файл в случае успешного завершение и – 1 в случае ошибки:
# include
int close (int filedes)
filedes=open (file,O_RDONLY);
.
.
.
close(filedes);
- Системный вызов write – копирует данные из буфера программы, рассматриваемого как массив, во внешний файл. Как и read, имеет три аргумента: дескриптор файла filedes, указатеь на записываемые данные buffer и n – положительное число записываемых байтов.
# include
ssize_t write (int filedes, const void *buffer,size_t n);
- Функция pipe(2) (создание канала)
Функция pipe(2) служит для создания однонаправленного (симплексного) канала (анонимного) обмена данными между двумя родственными процессами, т.к. только они имеют возможность получить доступ к одному и тому же каналу. После завершения работы канал уничтожается.
Функция имеет вид:
# include
int pipe (int fildes[2]);
Функция возвращает два fd в массиве [ ], причем fildes[0] служит для чтения данных из канала, а fildes[1] для записи данных в канал.
Пример приложения клиент-сервер, использующего FIFO для обмена данными.
Клиент посылает серверу сообщенияHello, а сервер выводит это сообщение на терминал.
Клиент:
#include
#include
# include
/*Соглашение об имени FIFO*/
# define FIFO fifo.1
main()
{
int writefd, n;
/*Получим доступ к FIFO*/
if ((writefd=open(fIFO,O_WRONLY))<0){
printf(Невозможно открыть FIFO\n); exit(1);}
/*Передадим сообщение серверу FIFO*/
if (write(writefd, Здравствуй,Мир!\n,18)!=18){
printf(Ошибка записи\n); exit(1);}
/*Закроем FIFO*/
close (writefd);
/*Удалим FIFO*/
if (unlink(FIFO)<0){
printf(Невозможно удалить FIFO\n); exit (1); }
exit(0);
}
Сервер:
#include
#include
#include
#define FIFO fifo.1
#

main
main ()
{
int readfd, n;
char buff[MAXBUFF]; /*буфер для чтения данных из FIFO*/
/*Создадим специальный файл FIFO с открытыми для всех правами доступа на чтение и запись*/
if (_mknod(FIFO,S_IFIFO|0666,0)<0){
printf(Невозможно создать FIFO\n); exit(1); }
/*Получим доступ к FIFO*/
if ((readfd=open(FIFO,O_RDONLY))<0){
printf(Невозможно открыть FIFO\n); exit(1);}
/*Прочитаем сообщение (Здравствуй,Мир!) и выведем его на экран*/
while ((n=readfd,buff,MAXBUFF))>0)
if(write (1,buff,n)!=n){
printf(Ошибка вывода \n); exit (1); }
/*Закроем FIFO, удаление FIFO – дело клиента*/
close (readfd);
exit(0);
}