Необходимо увеличить буфер для очереди сообщений IPC в OpenWRT
Я только учусь пользоваться очередями сообщений, и у меня возникли небольшие трудности с ними. Для тестирования я использую два совершенно разных приложения: одно - "отправитель", а другое - "получатель".
Когда я запускаю отправителя, он отправляет 15 строк в канал, но затем завершается с ошибкой "Ресурс временно недоступен". Мне просто нужно потреблять сообщения на стороне получателя, но почему только 15 сообщений? Я мог бы отправлять много сообщений, поэтому я хотел бы увеличить это число до гораздо большего, например 1000 или около того.
Я попытался установить размер очереди сообщений равным 32767, поэтому я ожидал, по крайней мере, 31, но, видимо, msg_qbytes
не связано с количеством сообщений, которые могут быть буферизованы.
Код отправителя выглядит так:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <unistd.h>
#include <string.h>
#define MESSAGE_SIZE 1024
typedef struct msgbuf
{
long mtype;
char mtext[MESSAGE_SIZE];
};
int main(int argc, char *argv[]) {
int msgid;
int ret;
struct msqid_ds msg_settings;
long key;
struct msgbuf msg;
key = strtol(argv[1], NULL, 10);
// print the message queue ID for reading via msgrcv
printf( "Getting message queue with key = %ld\n", key);
usleep( 1000000);
msgid = msgget( (key_t)key, 0666 | IPC_CREAT);
if (msgid == -1) {
perror("msgget failed with error");
exit(EXIT_FAILURE);
}
// read in current queue settings and then set the new
// queue size.
ret = msgctl(msgid, IPC_STAT, &msg_settings);
msg_settings.msg_qbytes = 32767;
msgctl( msgid, IPC_SET, &msg_settings);
while( 1) {
msg.mtype = 1; // we'll always leave this as 1
memset( &(msg.mtext), 0, MESSAGE_SIZE);
sprintf( msg.mtext, "hi");
printf( "Sending data: %s\n", msg.mtext);
ret = msgsnd( 1, &msg, MESSAGE_SIZE, IPC_NOWAIT);
usleep( 500000);
if( ret == -1) {
perror( "msgsnd failed\n");
}
printf( "leaving...\n");
return EXIT_SUCCESS;
}
Код получателя выглядит так:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#define MESSAGE_SIZE 1024
typedef struct msgbuf
{
long mtype;
char mtext[MESSAGE_SIZE];
};
int main(int argc, char *argv[]) {
long int msgtyp = 1;
int ret;
size_t msgsz;
struct msgbuf mymsg;
int msgid;
msgid = strtol(argv[1], NULL, 10);
printf( "Reading message queue with ID = %d\n", msgid);
usleep( 1000000);
while( 1) {
msgsz = (size_t)MESSAGE_SIZE;
ret = msgrcv( msgid, &mymsg, msgsz, msgtyp, IPC_NOWAIT);
if( ret == ENOMSG) {
usleep( 100000);
continue;
}
if( ret == -1) {
perror( "msgrcv failed");
} else {
printf( "Read data: %s", mymsg.mtext);
}
usleep( 100000);
}
return EXIT_SUCCESS;
}
3 ответа
Я наконец нашел информацию: http://wiki.openwrt.org/doc/uci/system
Вам просто нужно изменить / etc / config / system и добавить `option buffersize 65535'. К сожалению, вы не можете пойти выше, чем 64 КБ.
Я сделал изменение, и оно определенно лучше, но не идеально. Я собираюсь уменьшить свой размер сообщения, чтобы попытаться разместить больше сообщений.
Часть оригинальной проблемы, которую я уже решил:
On the receiver side, I always get a "Argument list too long" error.
I changed my code to just use a #define so that I'm (hopefully) not
making any errors when passing the size as an argument. But when I
looked online for solutions to the E2BIG error, it says that the
size of the message is too large. How can that be?
Хорошо, я не смог правильно интерпретировать эту информацию:
От http://publib.boulder.ibm.com/infocenter/iseries/v5r3/topic/apis/ipcmsgrc.htm:
[E2BIG]
Argument list too long.
The size in bytes of the message is greater than msgsz and the MSG_NOERROR flag is not set in the msgflg parameter.
Я думал, что MSG_NOERROR был необязательным. Думаю это не так Проблема № 2 решена! Просто нужно как-то увеличить количество сообщений в очереди... и тогда я, вероятно, попаду в другую загвоздку.:)
Это описывает файл sysctl.conf в linux, другие O/S будут иметь другие механизмы для того же самого.