Linux消息队列


所谓消息队列就是指一个消息链表。

int msgget(key_t, int flag):创建和打开队列

int msgsnd(int msqid, struct msgbuf *msgp, size_t msgsz, int flag):发送消息,msgid是消息队列的id,msgp是消息内容所在的缓冲区,msgsz是消息的大小,msgflg是标志。

int msgrcv(int msqid, struct msgbuf *msgp, size_t msgsz, long msgtyp, int flag):接受消息,msgtyp是期望接收的消息类型。

int msgctl(int msqid, int cmd, struct msqid_ds *buf):控制

  1. #include <sys/types.h>   
  2. #include <sys/ipc.h>   
  3. #include <sys/msg.h>   
  4. #include <stdio.h>   
  5. #include <stdlib.h>   
  6. #include <unistd.h>   
  7. #include <string.h>   
  8. #define BUFSZ 512   
  9. struct message{          //消息结构体   
  10.     long msg_type;  
  11.     char msg_text[BUFSZ];  
  12. };  
  13.   
  14. int main()  
  15. {  
  16.     int qid;  
  17.     key_t key;  
  18.     int len;  
  19.     struct message msg;  
  20.   
  21.     if((key=ftok(".",'a'))==-1)        //ftok获得一个key   
  22.     {  
  23.         perror("ftok");  
  24.         exit(1);  
  25.     }  
  26.     if((qid=msgget(key,IPC_CREAT|0666))==-1){    //创建一个消息队列   
  27.         perror("msgget");  
  28.         exit(1);  
  29.     }  
  30.     printf("opened queue %d\n",qid);  
  31.     puts("Please enter the message to queue:");  
  32.     if((fgets(msg.msg_text,BUFSZ,stdin))==NULL)     // 从标准输入获取输入   
  33.     {  
  34.         puts("no message");  
  35.         exit(1);  
  36.     }  
  37.     msg.msg_type = getpid();       
  38.     len = strlen(msg.msg_text);  
  39.     if((msgsnd(qid,&msg,len,0))<0){                 //发送消息   
  40.         perror("message posted");  
  41.         exit(1);  
  42.     }  
  43.     if(msgrcv(qid,&msg,BUFSZ,0,0)<0){               //接收消息   
  44.         perror("msgrcv");  
  45.         exit(1);  
  46.     }  
  47.     printf("message is:%s\n",(&msg)->msg_text);  
  48.     if((msgctl(qid,IPC_RMID,NULL))<0){              //删除消息   
  49.         perror("msgctl");  
  50.         exit(1);  
  51.     }  
  52.     exit(0);  
  53. }  

相关内容