linux進程間通信-------消息隊列

消息隊列屬於IPC
兩個進程間要通過消息隊列進行通信,比如A通過消息隊列給B傳送一個消息。首先A要建立一個消息隊列,然後A往該消息隊列裏面發送消息(由一個有特殊形式的結構體構成,包括數據類型和數據內容),當不需要使用這個消息隊列的時候刪除消息隊列。B要做的事情是打開消息隊列,打開方式是用和A裏面一樣的鍵值打開對應的消息隊列,然後接收消息隊列的消息(即結構體中某個類型的數據),結束。

相關函數

創建/打開消息隊列  msgget

發送數據  msgsnd

從消息隊列取消息  msgrcv

刪除消息隊列   msgctl


例如A進程代碼

#include

#include

#include

#include

#include

#include


struct msgt

{

    long msgtype;

    char msgtext[1024];

};


void main()

{

    int msqid;

    int msg_type;

    char str[256];

    struct msgt msgs;

    

    //創建消息隊列

    msqid = msgget(1025, IPC_CREAT);

    

    //循環

    while(1)

    {

    printf("please input message type, 0 for quit!\n");

    //獲取消息類型

    scanf("%d", &msg_type);

   

    //如果用戶輸入的消息爲0,則退出

    if(msg_type == 0)

    break;

   

    printf("please input message data!\n");

    //獲取消息數據

    scanf("%s", str);

   

    msgs.msgtype = msg_type;

    strcpy(msgs.msgtext, str);

   

    //發送消息

    msgsnd(msqid, &msgs, sizeof(struct msgt), 0);

    }

    

    //刪除消息隊列

    msgctl(msqid, IPC_RMID, 0);

 

}



B進程代碼

#include

#include

#include

#include

#include

#include


int msqid;


struct msgt

{

    long msgtype;

    char msgtext[1024];

};


void myprocess()

{

    struct msgt ms;

    int x;

    

    x = msgrcv(msqid, &ms, sizeof(struct msgt), 0, 0);

    

    printf("the receive text: %s    %d\n", ms.msgtext, x);

}


void main()

{

    int i;

    int cpid;

    

    //打開消息隊列

    msqid = msgget(1025, IPC_EXCL);

    

    printf("the msqid is %d\n", msqid);

    

    myprocess();

}



 

 

 

 

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