首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

Linux C 編程實戰:消息隊列完整示例代碼與運行效果演示

     編輯:關於C語言

消息隊列核心概念

  • 內核維護的消息鏈表,通過隊列標識符訪問
  • 類似管道,但**每條消息有類型**,接收端可指定類型讀取(非強制 FIFO)
  • 相關頭文件:sys/types.h、sys/ipc.h、sys/msg.h

完整代碼

#include 
#include 
#include 
#include 
#include 

struct msgbuf {
    long msgtype;      // 消息類型(必須 > 0)
    char msgtext[1024]; // 消息內容
};

int main() {
    key_t unique_key;
    int msgid;
    int status;
    char str1[] = "test message:hello muge0913";
    char str2[] = "test message:goodbye muge0913";
    struct msgbuf sndmsg, rcvmsg;

    // 創建私有隊列
    if ((msgid = msgget(IPC_PRIVATE, 0666)) == -1) {
        perror("msgget"); exit(1);
    }

    // 發送類型 111
    sndmsg.msgtype = 111;
    sprintf(sndmsg.msgtext, "%s", str1);
    if (msgsnd(msgid, &sndmsg, sizeof(str1)+1, 0) == -1) {
        perror("msgsnd"); exit(1);
    }

    // 發送類型 222
    sndmsg.msgtype = 222;
    sprintf(sndmsg.msgtext, "%s", str2);
    if (msgsnd(msgid, &sndmsg, sizeof(str2)+1, 0) == -1) {
        perror("msgsnd"); exit(1);
    }

    // 非阻塞接收類型 222
    if ((status = msgrcv(msgid, &rcvmsg, 80, 222, IPC_NOWAIT)) == -1) {
        perror("msgrcv"); exit(1);
    }

    printf("The received message: %s\n", rcvmsg.msgtext);

    // 刪除隊列
    msgctl(msgid, IPC_RMID, 0);
    return 0;
}

運行結果

消息隊列運行截圖

輸出:The received message: test message:goodbye muge0913

關鍵函數速查

函數作用
msgget(key, flags)創建/獲取隊列,返回標識符
msgsnd(msqid, msgp, msgsz, flag)發送消息,flag=0 阻塞,IPC_NOWAIT 非阻塞
msgrcv(msqid, msgp, msgsz, msgtyp, flag)接收消息,msgtyp=0 取首條,>0 取指定類型,<0 取類型≤|msgtyp| 首條
msgctl(msqid, cmd, buf)控制:IPC_RMID 刪除,IPC_STAT/SET 狀態讀寫

注意事項

  • 消息類型 long msgtype 必須為正數
  • 發送大小含結構體靈活數組部分,示例用 sizeof(str)+1 含結束符
  • 接收緩衝區需足夠大,否則截斷/報錯
  • IPC_PRIVATE 每次創建新隊列,生產環境常用 ftok 生成 key
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved