2013-06-01 154 views
3

我剛剛學習如何使用消息隊列,並且我遇到了一些困難。我使用兩個完全獨立的應用程序來進行測試 - 一個是「發件人」,另一個是「接收器」。需要爲OpenWRT中的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; 
} 

接收器的代碼如下所示:

,我已經解決了原來的問題
#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; 
} 

回答

2

我終於找到了信息:http://wiki.openwrt.org/doc/uci/system

你只需要修改/ etc /配置/系統,並添加`選項BUFFERSIZE 65535' 。不幸的是,你不能超過64K。

我做了改變,它絕對更好,但並不完美。我將削減我的郵件大小以嘗試容納更多郵件。

0

部分:

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解決了!只需要增加隊列中消息的數量...然後我可能會遇到另一個障礙。 :)