QNX MsgReceive Pulse

Имам проблем, защото не знам как работи _pulse receive. Ако имам моята структура от данни

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