Linux IPC 之消息隊列

System V  or  POSIX ?

該使用哪個呢, 這是個問題 ...

相對而言,我更傾向於後者 posix mq

posix mq 的概況看這裏:man mq_overview

簡單的實現代碼:

#include <mqueue.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

#define MY_MQ_NAME "/my_test_mq"
#define MSG_LEN 8192
struct my_msg
{
    unsigned int msg_type;
    char msg_date[MSG_LEN];
};

int main(int argc, char ** argv)
{
    unsigned int prio;
    struct my_msg msg;
    struct mq_attr attr;
    ssize_t mq_ret;
    char mq_msg[MSG_LEN];
    mqd_t mqd;

    // creat
    attr.mq_maxmsg = 40960;
    attr.mq_msgsize = MSG_LEN;
    mqd = mq_open(MY_MQ_NAME, O_RDWR|O_CREAT, S_IRWXU|S_IRWXG, &attr);
    if(mqd < 0)
    {
        perror("mq_open error");
        return -1;
    }

    //get attribute
    mq_ret = mq_getattr(mqd, &attr);
    if(mq_ret == -1)
    {
        perror("mq_getattr");
        mq_close(mqd);
        exit(1);
    }
    printf("max #msgs=%ld, max #bytes/msg=%ld, current msg =%ld\n",\
            attr.mq_maxmsg,attr.mq_msgsize,attr.mq_curmsgs);

    //reveive msg
    while(1)
    {
        mq_ret = mq_receive(mqd, mq_msg, sizeof(mq_msg), NULL);
        printf("%s\n",mq_msg);
        if(mq_ret == -1)
        {
            perror("mq_receive error");
            mq_close(mqd);
            break;
        }
        usleep(32);
    }

    mq_close(mqd);

    return 0;
}


發送消息代碼:

int main(int argc, char **argv)
{
    int mq_ret;
    mqd_t mqd;
    size_t len;
    char *ptr;
    unsigned int prio;

    prio = 0;
    ptr = (char*)malloc(MSG_LEN);
    if(ptr == NULL)
    {
        perror("malloc ptr error");
        return -1;
    }
    strcpy(ptr,"Hello mqueue, I am who you do not know !");

    mqd = mq_open(MY_MQ_NAME, O_WRONLY);
    if(mqd == -1)
    {
        perror("mq_open error");
        return -1;
    }

    while(1)
    {
        mq_ret = mq_send(mqd, ptr, MSG_LEN, prio);
        if(mq_ret == -1)
        {
            perror("mq_send error");
            mq_close(mqd);
            break;
        }
        usleep(2);
    }
    return 0;
}


另外, Linux 系統中POSIX mq 的大小限制查看及設置命令:

# ulimit -q

當然也可以在程序中設置:

    struct rlimit new_rlimit;
    new_rlimit.rlim_cur = NEW_MQ_MEM_LIMIT;
    new_rlimit.rlim_max = NEW_MQ_MEM_LIMIT;
    if (setrlimit(RLIMIT_MSGQUEUE, &new_rlimit) != 0)
     {
         perror("Failed BUG exploit! setrlimit() didn't return success");
        return EXIT_FAILURE;
     }





參考:

http://www.cnblogs.com/polestar/archive/2012/4/16.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章