Синхронизация и взаимодействие программных потоков в операционной среде реального времени. Дорогов А.Ю. - 39 стр.

UptoLike

Составители: 

39
/* передача сообщения */
status=MsgSend(coid,&send_buf, sizeof(send_buf), &reply_buf, sizeof(reply_buf));
printf ("Client thread: message <%s> has received \n", &reply_buf);
ConnectDetach(coid); // уничтожить соединение
pthread_exit(NULL);
}
/*********************************************************************************/
int main() { // главный поток
pthread_t server_tid, client_tid;
pthread_create(&server_tid, NULL, &server, NULL); // создать поток сервера
pthread_create(&client_tid, NULL, & client, NULL); // создать поток клиента
pthread_join(client_tid,NULL);
return 0;
}
Последним параметром функции MsgReceive() является указатель на
структуру _msg_info. Эта структура позволяет серверу получить добавоч-
ную информацию о клиенте, пославшем сообщение. Структура имеет сле-
дующий формат:
struct _msg_info {
uint32_t nd; /* дескриптор сетевого узла клиента */
uint32_t srcnd; /* дескриптор сетевого узла сервера */
pid_t pid; /* pid клиента */
int32_t tid; /* tid клиента */
int32_t chid; /* идентификатор канала */
int32_t scoid; /* идентификатор серверного соединения* /
int32_t coid; /* идентификатор клиентского соединения */
int32_t msglen; /* число полученных байт */
int32_t srcmsglen; /* длина посланного сообщения в байтах */
int32_t dstmsglen; /* длина буфера клиента для ответа */
int16_t priority; /* приоритет посылающего потока */
int16_t flags; /* флаги */
uint32_t reserved; /* зарезервировано */
};
Поле flags может содержать следующий битовый флаг:
_NTO_MI_UNBLOCK_REQ – клиент пытается выполнить деблокировку Send-
блокированного состояния, но не может этого сделать, поскольку для канала установлен флаг
_NTO_CHF_UNBLOCK.
Если в качестве последнего параметра в вызове MsgReceive() указано
NULL, то информацию о клиенте можно получить позже с помощью вызова
MsgInfo() – т. е. она не теряется. Функция MsgReceive() возвращает иден-
тификатор отправителя (rcvd) – это целое число, действующее как «жетон»,
по которому возвращается ответное сообщение. Функция MsgReply() при-
нимает в качестве параметров идентификатор отправителя, код возврата,
указатель на ответное сообщение и размер этого сообщения. Код возврата
указывает, какой код статуса должна возвратить функция MsgSend() на сто-
роне клиента. Ответное сообщение может иметь нулевую длину. Единст-
венная цель ответаразблокировать клиента. Как вариант вместо функции
MsgReply() можно использовать функцию MsgError(), которая не передает
ответное сообщение, а возвращает только код ошибки (в глобальной пере-
менной errno). После вызова функции MsgReply() идентификатор отправи-