QNX RTP Logo QNX Realtime Platform: Русский Портал QNX
Thursday, 20 Nov 2008 20:13
Меню

Проект OpenNET - все о Unix
Главная

 · Начало · Статистика · Поиск ·

  QNX.ORG.RU —› Программирование под QNX —› Странности MsgSend

Посл.ответ Сообщение


Дата: 12 Май,  07:24 · Поправил: qnxloder

2 процесса:
1 делает
MsgSend(coid, NULL, 0, &msg, sizeof(msg) )

2 делает
*msg=5;
MsgReply( rcvid, EOK, msg, sizeof(*msg) )

После Send в msg пусто
А если сделать так, то в msg то что надо:
1 делает
MsgSend(coid, &msg, sizeof(msg), &msg, sizeof(msg) )

2 делает
*msg=5;
MsgReply( rcvid, EOK, msg, sizeof(*msg) )

Почему так может быть?
Благодарю.


Дата: 12 Май,  07:37 · Поправил: JUt

qnxloder

2 делает
msg=5;
MsgReply( rcvid, EOK, msg, sizeof(*msg) )


Если у тебя msg указатель, то надо делать так:

*msg=5;

PS: Вот до чего Си++ людей доводит, не говоря уже о Си+.


Дата: 12 Май,  07:56

qnxloder

2 процесса:
1 делает
MsgSend(coid, NULL, 0, &msg, sizeof(msg) )


Странное намерение - это вы так хотите передать сообщение длины 0? Я совсем не уверен, что это вообще возможно, такую деталь нужно уточнить в HELP - POSIX write(), например, при длине 0 - не устанавливает код ошибки, но никакой фактической передачи данных не производит. У вас же перед MsgReply() наверняка стоит что-то типа MsgReceive() - посмотрите что он принимает. А заодно, хорошо бы посмотреть результат, возвращаемый MsgSend() после такого своего вызова.


Дата: 12 Май,  08:04

---cut---
Странное намерение - это вы так хотите передать сообщение длины 0?
---cut---

ничего странного, обычное желание засинхронизовать два процесса через SRR, почему бы и нет.

---cut---
Я совсем не уверен, что это вообще возможно, такую деталь нужно уточнить в HELP - POSIX write(), например, при длине 0 - не устанавливает код ошибки, но никакой фактической передачи данных не производит. У вас же перед MsgReply() наверняка стоит что-то типа MsgReceive() - посмотрите что он принимает. А заодно, хорошо бы посмотреть результат, возвращаемый MsgSend() после такого своего вызова.
---cut---

таки SRR ну никак не ложится на POSIX, тем более на File IO

// wbr


Дата: 12 Май,  08:08

Olej

Странное намерение - это вы так хотите передать сообщение длины 0?


А как же это делают изобретатели таких языков как Си+?

Olej

Я совсем не уверен, что это вообще возможно,


И этот человек выпускает альманахи? Да любой здравомыслящий человек после таких (неоднократных) горбух на такие альманахи должен класть трёхэтажные альмапохи.


Дата: 12 Май,  08:18

Olej
А заодно, хорошо бы посмотреть результат, возвращаемый MsgSend() после такого своего вызова.

-1 не возвращает.

Olej
2 процесса:
1 делает
MsgSend(coid, &msg, 1, &msg, sizeof(msg) )


Так не работает...

А вот так работает:
MsgSend(coid, &msg, 2, &msg, sizeof(msg) )

К слову у msg длина 116 байт.

Olej
У вас же перед MsgReply() наверняка стоит что-то типа MsgReceive() - посмотрите что он принимает.

Принимает он то что и передаю
А вот Replay в ответный буфер ложит см. выше.


Дата: 12 Май,  08:28

MsgSend(coid, &msg, 2, &msg, sizeof(msg) ) возвращает EOK
MsgSend(coid, &msg, 1, &msg, sizeof(msg) ) возвращает EOK


Дата: 12 Май,  19:30

qnxloder
MsgSend(coid, NULL, 0, &msg, sizeof(msg) )

Даже если есть возможность по MsgSend() отослать 0 байт, то нигде в описаниях:

int MsgSend( int coid,
const void* smsg,
int sbytes,
void* rmsg,
int rbytes );

- я не встречал (ещё раз пересмотрел несколько мест), чтобы в качестве smsg можно было задать NULL... В конце-концов, если так нужно именно 0 байт, попробуйте что-то хоть такое:
int i;
MsgSend(coid, &i, 0, &msg, sizeof(msg) )
- что в этом случае примите на приёмном конце?


Дата: 12 Май,  19:38

qnxloder

MsgReply( rcvid, EOK, msg, sizeof(*msg) )
После Send в msg пусто


Кстати, "после Send в msg пусто" - будет именно, если ответ:
MsgReply( rcvid, EOK, NULL, 0 )
- только разблокирование клиента. Посмотрите, всё ли у вас в порядке с 3-4-м параметром при ответе.


Дата: 13 Май,  05:00

Olej
Даже если есть возможность по MsgSend() отослать 0 байт, то нигде в описаниях:


int MsgSend( int coid,

const void* smsg,

int sbytes,

void* rmsg,

int rbytes );


- я не встречал


MsgSend(coid, NULL, 0, &msg, sizeof(msg))
Это из примера в описании ф-ии MsgKeyData(), MsgKeyData_r().
Olej
MsgSend(coid, &i, 0, &msg, sizeof(msg) )
- что в этом случае примите на приёмном конце?
Тоже пустое сообщение.


Olej
MsgReply( rcvid, EOK, NULL, 0 )
- только разблокирование клиента. Посмотрите, всё ли у вас в порядке с 3-4-м параметром при ответе.

Да смотрел в дебагере, там все ок.


Дата: 16 Авг,  11:58

Если подумать логически, то по идее:
ответ приходит на что-то.
Вы не можете получить ответ, если ничего не сказали.
Если вы желаете что-то услышать - слушайте. Но инициировать диалог не сказав ни слова - странно.
Поэтому, возможно, что MsgSend работает исходя из таких соображений?


Дата: 5 Сен,  15:03

may be you got some pulse?
try to analyze rcvid


Дата: 5 Сен,  17:04

Этому посту уже несколько лет. Плохо, что форум не показывает год поста

You must login to post.

©   2000-2003 Команда проекта QNX.ORG.RU // QNX.ORG.RU Team
Авторы проекта: Дмитрий Алексеев [dmi] и Дмитрий Васильев. Техническое сопровождение проекта: Игорь Сорокин [isorokin]. Информационное сопровождение: Дмитрий Алексеев [dmi]
QNX - зарегистрированная торговая марка QNX Software Systems, Ltd., Canada. Остальные упоминаемые на сайте торговые марки и логотипы являются исключительно собственностью их уважаемых владельцев. Ничьи права не затронуты. Материалы сайта не могут быть скопированы и где-либо использованы в той или иной форме без письменного разрешения разработчиков сайта.
Powered by Mambo Open Source