QNX MsgReceive Pulse

У меня проблема, потому что я не знаю, как работает прием _pulse. Если у меня есть структура данных

typedef struct _my_data {
msg_header_t hdr;
int data;
} my_data_t;

и я получаю только свое сообщение, я не могу сказать, пульс

my_data_t msg;
...
rcvid = MsgReceive(g_Attach->chid, &msg, sizeof(msg), NULL);

когда rcvid = 0, НО как программа узнает, что ей нужно отправить _pulse в форме msg (структура, которую я определил) или еще как это работает. Кроме того, является ли _IO_CONNECT импульсом? Если да, то почему у него нет rcvid==0? - согласно http://www.qnx.com/developers/docs/6.3.2/neutrino/lib_ref/n/name_attach.html


person user3613919    schedule 26.10.2015    source источник
comment
Хорошо, согласно qnx.com/developers/docs/qnxcar2/ _IO_CONNECT - это не ошибка, не импульс, поэтому сообщение (я полагаю, системное сообщение). Но все же я не знаю, как MsgReceive идентифицирует мою структуру.   -  person user3613919    schedule 27.10.2015


Ответы (2)


1 - _IO_CONNECT не используется для импульса. Используется для подключения системного вызова к менеджерам ресурсов. Примеры системных вызовов: open(), close() и т. д.

2 - Вам нужно знать, ожидает ли сервер или клиент импульсного сообщения или нет. Для импульсного сообщения функция блокировки в диспетчере ресурсов будет MsgReceivePulse(), а клиент будет использовать MsgSendPulse().

MsgSend() используется для обычного сообщения, а MsgSendPulse() — для отправки импульсного сообщения. Точно так же MsgReceive() используется для получения обычных сообщений, а MsgReceivePulse() используется для получения импульсных сообщений. Пожалуйста, обратитесь к документации QNX за более подробным описанием.

Оба варианта имеют разные параметры, например, функции для импульсных сообщений не имеют параметров для возвращаемых данных, потому что импульсы — это неблокирующие небольшие сообщения, которые не блокируются ни для какого ответа, а функции для обычных сообщений имеют параметры для получения данных.

person Shaibal    schedule 22.12.2015

Вам нужно создать channel и connection, например

chid=ChannelCreate(0);
int pid=getpid();
coid=ConnectAttach(0, pid, chid, 0, 0);

и прикрепите канал к соединению..............

Затем, если у вас есть два потока........... из одного потока вы можете вызвать функцию MsgSend, например MsgSend(coid, &(message), sizeof(message), &rmsg, sizeof(rmsg));, а в другом потоке rcvid=MsgReceive(chid, (void*)&message, sizeof(message),NULL);

person Community    schedule 27.10.2015