Файл channel.h содержит объявления констант, типов и функций, используемых для манипулирования каналами.
Функция
Channel *ChanAlloc(void);
резервирует в куче память для канала, инициализирует его значением NotProcess_p. Она возвращает указатель на инициализированный канал в случае успешного выполнения, иначе результатом является NULL.
Функция
void ChanInit(Channel *chan);
инициализирует канал chan значением NotProcess_p.
Функция
int ChanReset(Channel *chan);
записывает в канал chan
значение NotProcess_p и возвращает либо NotProcess_p,
либо дескриптор процесса, ожидающего обмена посредством канала
chan. Значение NotProcess_p возвращается, если нет
процессов, ожидающих обмена по каналу chan, и все операции
обмена данными успешно завершились.
Пример.
#include <channel.h>
#include <stdlib.h>
Channel c1, *c2, *c3;
ChanInit(&c1);
c2 = (Channel *) malloc( sizeof (Channel) );
ChanInit(c2);
if ( ( c3 = ChanAlloc() ) == NULL )
abort();
Функции ChanIn и ChanOut соответственно принимают и передают cnt байт данных посредством канала chan. Функция ChanIn сохраняет полученные данные в массиве, указываемом cp, а функция ChanOut берет данные из массива cp.
void ChanIn
(Channel *chan, void *cp, int cnt);
void ChanOut (Channel *chan, void *cp, int cnt);
Функции
char ChanInChar
(Channel *chan);
void ChanOutChar (Channel *chan, char ch);
принимают и передают один байт данных посредством канала *chan.
Функции
int ChanInInt
(Channel *chan);
void ChanOutInt (Channel *chan, int n );
принимают и передают целое значение посредством канала chan.
Следующие функции аналогично функциям ChanIn и ChanOut принимают в массив cp или передают из него cnt байт данных, используя канал chan, но в отличие от них позволяют организовать надежный обмен данными по каналам. Функции ChanInChanFail и ChanOutChanFail можно аварийно завершить, передав целое и только целое значение по каналу failchan. Они возвращают 0, если обмен нормально завершен, и 1, если состояние ожидания обмена было прервано сообщением, поступившим по каналу failchan.
int ChanInChanFail
(Channel *chan, void *cp, int cnt, Channel *failchan);
int ChanOutChanFail(Channel *chan, void *cp, int cnt, Channel
*failchan);
Функции ChanInTimeFail и ChanOutTimeFail возвращают 0, если передача данных нормально завершена. Если канал не готов к вводу/выводу данных до наступления времени time, то функции аварийно завершаются и возвращают значение 1.
int ChanInTimeFail
(Channel *chan, void *cp, int cnt, int time);
int ChanOutTimeFail(Channel *chan, void *cp, int cnt, int
time);
Следующие константы описывают адреса линий связи транспьютера. Программа не должна явно использовать линии связи (их адреса), так как это может привести к ошибке. Линии связи должны назначаться каналам программы с помощью программы конфигуратор.
#define NotProcess_p
0x80000000
/* Адреса линий связи */
#define LINK0OUT ((Channel *) 0x80000000)
#define LINK1OUT ((Channel *) 0x80000004)
#define LINK2OUT ((Channel *) 0x80000008)
#define LINK3OUT ((Channel *) 0x8000000c)
#define LINK0IN ((Channel *) 0x80000010)
#define LINK1IN ((Channel *) 0x80000014)
#define LINK2IN ((Channel *) 0x80000018)
#define LINK3IN ((Channel *) 0x8000001c)
/* Адрес линии внешнего события */
#define EVENT ((Channel *) 0x80000020)