程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 進程間通信——消息傳遞(消息隊列)

進程間通信——消息傳遞(消息隊列)

編輯:C++入門知識

【申明:本文僅限於自我歸納總結和相互交流,有纰漏還望各位指出。 聯系郵箱:[email protected]】 消息隊列就是消息的列表。我們可以把它想象成一個鏈表隊列,用戶可以從消息中添加消息或讀取消息,從這樣看它具有FIFO的特性,但它可以實現消息的隨機查詢,因而比FIFO具有更大的優勢,消息隊列存在於內核中,由“隊列ID”來標識。 消息隊列特點: 一、既可以用於親緣關系的進程(線程)中,有可以用於非親緣關系的進程(線程)中。 二、可以順序訪問、隨機訪問數據。 三、系統V消息隊列是隨內核持續的,只有在內核重起或者顯式刪除一個消息隊列時,該消息隊列才會真正被刪除。   下面兩個代碼演示功能: server.c:創建一個消息隊列,並獲取鍵盤輸入內容然後寫入到消息隊列中。 client.c :打開server.c創建的消息隊列,讀取消息隊列中內容然後顯示到屏幕上。 服務端: [cpp]   #include <sys/types.h>   #include <sys/ipc.h>   #include <sys/msg.h>   #include <stdio.h>   #include <stdlib.h>   #include <unistd.h>   #include <string.h>   #include <string.h>      #define   BUFFER_SIZE   512        struct message   {       long msg_type;       char msg_text[BUFFER_SIZE];   };      int main()   {       int qid;       key_t  key;       struct message  msg;              /*根據不同的路徑和關鍵字產生標准的key*/       if((key = ftok(".", 512)) == -1)       {           perror("ftok");           exit(1);       }          /*創建消息隊列*/       if((qid = msgget(key, IPC_CREAT|0666)) == -1)       {           perror("msgget");           exit(1);       }       printf("Open queue %d\n", qid);              while(1)       {           printf("input some message to the queue:");           if((fgets(msg.msg_text, BUFFER_SIZE, stdin)) == NULL)           {               puts("no message");               exit(1);           }           msg.msg_type = getpid();                      /*添加消息到消息隊列中*/           if((msgsnd(qid, &msg, strlen(msg.msg_text), 0)) <0)           {               perror("message posted");               exit(1);           }           if(strncmp(msg.msg_text, "quit", 4) == 0)           {               break;           }       }       exit(0);   }     客服端: [cpp]   #include <sys/types.h>   #include <sys/ipc.h>   #include <sys/msg.h>   #include <stdio.h>   #include <stdlib.h>   #include <unistd.h>   #include <string.h>   #include <string.h>      #define BUFFER_SIZE   512      struct message   {       long msg_tpye;       char msg_text[BUFFER_SIZE];   };      int main()   {       int qid;       key_t  key;       struct message  msg;              /*根據不同的路徑和關鍵字產生標准的key*/       if((key = ftok(".", 512)) == -1)       {           perror("ftok");           exit(1);       }              if((qid = msgget(key, IPC_CREAT|0666)) <0)       {           perror("msgget");           exit(1);       }       printf("Open queue %d\n", qid);              do       {           memset(msg.msg_text, 0, BUFFER_SIZE);           if((msgrcv(qid, (void*)&msg, BUFFER_SIZE, 0, 0)) <0)           {               perror("msgrcv");               exit(1);           }           printf("The message form process %d: %s", msg.msg_tpye, msg.msg_text);       }while(strncmp(msg.msg_text, "quit", 4));              if((msgctl(qid, IPC_RMID, NULL)) <0)       {           perror("msgctl");           exit(1);       }       exit(0);   }    

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved