LINUX.ORG.RU

Большая просьба _внимательно_ изучить документацию по System V IPC.

Надеюсь патчи ты понимаешь ;)
Держи:
--- eventkernel.cc.orig	2005-10-22 15:27:34.000000000 +0300
+++ eventkernel.cc	2005-10-22 15:51:39.000000000 +0300
@@ -12,6 +12,11 @@
 
 #define MSGMAX 8192
 
+struct my_msgbuf {
+	long mtype;
+	char mtext[MSGMAX];
+};
+
 EventKernel::EventKernel()
 {
     root = getpid();
@@ -43,7 +48,7 @@ void EventKernel::send ( const char * is
 	std::cerr << "Init false." << std::endl;
 	return;
     }
-    struct msgbuf *dataBuf = new msgbuf;
+    struct my_msgbuf *dataBuf = new struct my_msgbuf;
     dataBuf->mtype = 1;
     size_t s_msg = strlen ( istr ) > MSGMAX ? MSGMAX : strlen ( istr );
     strncpy ( dataBuf->mtext, istr, s_msg );
@@ -64,19 +69,21 @@ char * EventKernel::recv ()
 	return "Init false";
     }
     char *retStr;
-    struct msgbuf *dataBuf;
+    struct my_msgbuf *dataBuf = new struct my_msgbuf;
     size_t msgsz = msgrcv ( msqid, dataBuf, MSGMAX, 0, IPC_NOWAIT );
     std::cout << "recv meess size : " << msgsz << std::endl;
     if ( msgsz != -1 )
     {
 	retStr = new char[msgsz];
 	strncpy ( retStr, dataBuf->mtext, msgsz );
+	delete dataBuf;
 	return retStr;
     }
     else
     {//error
 	if ( errno == ENOMSG ) return "Queue is empty";
 	std::cerr << "Error can't recive messege." << std::endl;
+	delete dataBuf;
 	return "Error";
     }
 }

P.S. Вообще-то мне не очень нравиться стиль написания (в частности
обработка ошибок, точнее почти полное отсутствие таковой) - но
это скорее идеологические вопросы, обсуждать не будем.

anonymous
()
Ответ на: комментарий от anonymous

> struct my_msgbuf *dataBuf = new struct my_msgbuf;
...
> delete dataBuf;

правельней было бы использовать std::auto_ptr, а то код приходится
дублировать

anonymous
()
Ответ на: комментарий от anonymous

> правельней было бы использовать std::auto_ptr, а то код приходится дублировать

согласен - я уже высказал свое недовольство стилем написания :)

Просто проблема была в другом: автор использовал struct msgbuf для передачи сообщений больше 1-го байта. При том что окументации указано что struct msgbuf - это скорее "шаблон" структуры.

Приведенный патч - минимально необходимые изменения, чтоб все заработало.

Кстати, теперь я там вижу еще одну ошибку: код 'if ( errno == ENOMSG ) return "Queue is empty";' также должен делать 'delete dataBuf;'

anonymous
()
Ответ на: комментарий от anonymous

>P.S. Вообще-то мне не очень нравиться стиль написания (в частности
>обработка ошибок, точнее почти полное отсутствие таковой) - но
>это скорее идеологические вопросы, обсуждать не будем.

Кхм, int err = errno , switch(err) и дальнейший case по всем константам имеется.
Но саму суть не меняют, только "увеличивуют код для чтения", есть люди 
которые могут "не осилить :)" для них убрал обработку.

Ессно в реальном используемом классе таковая будет присутствовать.

Спасибо большое. 
Теперь я понял смысл того что в msg{snd,recv} передается void *buf.

fura13 ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.