Dav*_*ave 5 c linux openwrt sysv-ipc
我刚刚学习如何使用消息队列,但我在使用它们时遇到了一些困难。我使用两个完全独立的应用程序来进行测试——一个是“发送者”,另一个是“接收者”。
当我运行发送器时,它向管道发送 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;
}
Run Code Online (Sandbox Code Playgroud)
接收器代码如下所示:
#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;
}
Run Code Online (Sandbox Code Playgroud)
我终于找到了信息: http: //wiki.openwrt.org/doc/uci/system
您只需修改 /etc/config/system 并添加“option buffersize 65535”即可。不幸的是,你不能高于 64k。
我做了改变,它确实更好了,但并不完美。我将减少消息大小以尝试容纳更多消息。