歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Linux基礎編程 消息隊列 msgsnd

實際上,消息隊列常常保存在鏈表結構中。擁有權限的進程可以向消息隊列中寫入或讀取消息。

消息隊列本身是異步的,它允許接收者在消息發送很長時間後再取回消息,這和大多數通信協議是不同的。例如WWW中使用的HTTP協議是同步的,因為客戶端在發出請求後必須等待服務器回應。然而,很多情況下我們需要異步的通信協議。比如,一個進程通知另一個進程發生了一個事件,但不需要等待回應。但消息隊列的異步特點,也造成了一個缺點,就是接收者必須輪詢消息隊列,才能收到最近的消息。

和信號相比,消息隊列能夠傳遞更多的信息。與管道相比,消息隊列提供了有格式的數據,這可以減少開發人員的工作量。但消息隊列仍然有大小限制。

包含文件
1、msg.c
2、msg.h
3、thread.c

源文件1 msg.c

  1. #include <stdio.h>   
  2. #include <stdlib.h>   
  3. #include <unistd.h>   
  4. #include <sys/msg.h>   
  5.   
  6. #define __DEBUG   
  7. #ifdef __DEBUG   
  8. #define DBG(fmt,args...) fprintf(stdout,  fmt,  ##args)   
  9. #else   
  10. #define DBG(fmt,args...)   
  11. #endif   
  12. #define ERR(fmt,args...) fprintf(stderr,  fmt,  ##args)   
  13.   
  14. /* 
  15. 消息隊列初始化 
  16. msgKey:消息隊列鍵值 
  17. qid:返回值,消息隊列id 
  18. */  
  19. int Msg_Init( int msgKey )  
  20. {  
  21.     int qid;  
  22.     key_t key = msgKey;  
  23.     /* 
  24.     消息隊列並非私有,因此此鍵值的消息隊列很可能在其他進程已經被創建 
  25.     所以這裡嘗試打開已經被創建的消息隊列 
  26.     */  
  27.     qid = msgget(key,0);  
  28.     if(qid < 0){  
  29.         /* 
  30.         打開不成功,表明未被創建 
  31.         現在可以按照標准方式創建消息隊列 
  32.         */  
  33.         qid = msgget(key,IPC_CREAT|0666);  
  34.         DBG("Create msg queue id:%d\n",qid);  
  35.     }  
  36.     DBG("msg queue id:%d\n",qid);  
  37.     return qid;  
  38. }  
  39. /* 
  40. 殺死消息隊列 
  41. qid:消息隊列id 
  42. */  
  43. int Msg_Kill(int qid)  
  44. {  
  45.     msgctl(qid, IPC_RMID, NULL);  
  46.     DBG("Kill queue id:%d\n",qid);  
  47.     return 0;  
  48. }  
Copyright © Linux教程網 All Rights Reserved