天天看點

Linux程序間通信之消息隊列

  馬上過年了,心裡萬般滋味。。。

  

一,消息隊列

1,概念:“消息隊列”是在消息的傳輸過程中儲存消息的容器

2,消息隊列就是一個消息的連結清單。可以把消息看作一個記錄,具有特定的格式以及特定的優先級。

  對消息隊列有寫權限的程序可以向消息隊列中按照一定的規則添加新消息;

  對消息隊列有讀權限的程序則可以從消息隊列中讀走消息。

  消息隊列是随核心持續的。

3,程式設計注意事項:使用時先把資料封裝成消息,把消息存入隊列

程式設計步驟: 具體函數的用法可以用man手冊檢視(強力推薦)

(1)ftok()生産key

(2)使用msgget( ) 建立/擷取消息隊列,傳回值是隊列辨別符

(3)使用msgsnd( ) 發送消息

    使用msgrcv( ) 接收消息

(4)使用msgctl( ) 删除消息隊列

4,執行個體:

sendmsg.c   用來發送消息的

// sendmsg.c

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/msg.h>
#include<string.h>

struct my_msg
{
    int mtype; // 消息類型
    char buf[256];
}msg1, msg2;

int main()
{
    key_t key = ftok("./", 88);

    int msgid = msgget(key, 0666|IPC_CREAT);
    if(-1 == msgid)
    {
        perror("msgget failed!!!");
        exit(1);
    }

    msg1.mtype = 2;
    strcpy(msg1.buf, "hello, msg2");
    msgsnd(msgid, &msg1, sizeof(msg1), 0); // 阻塞
//    msgsnd(msgid, &msg1, sizeof(msg1), IPC_NOWAIT); // 非阻塞

    msg2.mtype = 1;
    strcpy(msg2.buf, "hello, msg1");
    msgsnd(msgid, &msg2, sizeof(msg2), 0); // 阻塞

    printf("消息發送完成,按回車銷毀消息隊列\n");
    getchar();

    if(-1 == shmctl(msgid, IPC_RMID, NULL))
    {
        perror("shmctl failed");
        exit(2);
    }
    return 0;
}      

recvmsg.c  用來接收消息的

// recvmsg.c

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/msg.h>
#include<string.h>

struct my_msg
{
    int mtype; // 消息類型
    char buf[256];
}msg;

int main()
{
    key_t key = ftok("./", 88);

    // 擷取消息隊列
    int msgid = msgget(key, 0);
    if(-1 == msgid)
    {
        perror("msgget failed!!!");
        exit(1);
    }

    int res = msgrcv(msgid, &msg, sizeof(msg),
            2, // 取消息類型為2的消息
            0);
    printf("類型:%d, 内容:%s\n", msg.mtype, msg.buf);

    printf("消息接收完成,按回車銷毀消息隊列\n");
    getchar();

    if(-1 == shmctl(msgid, IPC_RMID, NULL))
    {
        perror("shmctl failed");
        exit(2);
    }
    return 0;
}      

5,運作結果

Linux程式間通信之消息隊列
Linux程式間通信之消息隊列

6,擷取代碼  

git clone https://github.com/xcywt/xcyipc.git

有人看到這個麻煩再烏班圖中試試這個庫有沒有建好。主要是學習github的一些用法。

繼續閱讀