О. С. Попова Хіхловська І. В. Системне та прикладне програмне забезпечення у телекомунікаціях Конспект

Вид материалаКонспект
Размер канала
Функции к разделу FIFO
Функция fcntl(2)
Функция printf
Системный вызов write –
Функция pipe(2)
Клиент посылает серверу сообщенияHello, а сервер выводит это сообщение на терминал.
Подобный материал:
1   2   3   4   5   6   7   8   9   ...   14

Размер канала



В канале может находиться только определенное число байтов, прежде чем следующий вызов write будет заблокирован. Минимальный размер, определенный POSIK равен 512 байтов. Вызов write выполняется для канала неделимыми порциями и запись выполняется ядром за одну непрерывную операцию. Родительский выполняется в бесконечном цикле, а дочерний посылает сообщение родительскому, спрашивая канал и проверяя, поступили ли данные. Системный вызов fcntl устанавливает флаги F_SETFL и O_NONBLOCK

Функции к разделу FIFO




  1. Функция pipe(2) (создание канала)

Функция pipe(2) служит для создания однонаправленного (симплексного) канала (анонимного) обмена данными между двумя родственными процессами, т.к. только они имеют возможность получить доступ к одному и тому же каналу. После завершения работы канал уничтожается.

Функция имеет вид:

# include

int pipe (int fildes[2]);

Функция возвращает два fd в массиве [ ], причем fildes[0] служит для чтения данных из канала, а fildes[1] для записи данных в канал.
  1. Функция fcntl(2) ( управление файловыми операциями в уже открытых файлах, заданных дескриптором файла filedes)

# include - в этом заголовочном файле определены целочисленные константы: O_RDONLY и O_WRONLY.

int fcntl (int fildes, int cnd,…) – установка и снятие блокировки на файл его часть, создание каналов FIFO.

Функция fcntl(2) выполняет действие cmd с файлом , а третий аргумент зависит от конкретного действия:

а). F_SETLK – установить блокирование записи файла. Структура flock описывает блокирование, и указатель на нее передается в качестве третьего аргумента. При невозможности блокирования fcntl(2) возвращается с ошибкой EACCESS или EAGAIN;

б)F_SETLKW – аналогично предыдущему, но при невозможности блокирования по причине уже существующих блокировок, процесс переходит в состояние сна, ожидая снятие блокировок.

W – ждать;

в). F_SETFL – задает режим записи данных в конец файла.
  1. Функция printf – запись в стандартный вывод, форматизованный
  2. Системный вызов unlink(2) удаляет файл, например, unlink(/tmp/usedfile).

Вызов возвращает 0 в случае успешного завершения и – 1 – в случае ошибки.
  1. Системный вызов read копирует произвольное число символов или байтов из файла в буфер ( в ASCII)
  2. Системный вызов open открывает файл для чтения, записи или создает пустой файл.
  3. Системный вызов close – закрывает файл, возвращает файл в случае успешного завершение и – 1 в случае ошибки:

# include

int close (int filedes)

filedes=open (file,O_RDONLY);

.

.

.

close(filedes);
  1. Системный вызов write – копирует данные из буфера программы, рассматриваемого как массив, во внешний файл. Как и read, имеет три аргумента: дескриптор файла filedes, указатеь на записываемые данные buffer и n – положительное число записываемых байтов.

# include

ssize_t write (int filedes, const void *buffer,size_t n);

  1. Функция 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

#define MAXBUFF

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);

}