Linux消息队列编程实例


  1. /*  
  2.   创建消息队列msgget( )  
  3.   调整消息队列的参数msgctl(msgid,IPC_SET,struct msqid_ds* )  
  4.   发送一条消息msgsnd( )  
  5.   接受一条消息msgrcv( )  
  6.   移除一条消息msgctl( msgid,IPC_RMID,NULL )  
  7.  */  
  8. /*创建一个消息队列,并调整其大小,发送一条消息  
  9.   再取出该条消息,最后移除该消息队列  
  10.  */  
  11. #include <sys/types.h>   
  12. #include <sys/ipc.h>   
  13. #include <sys/msg.h>   
  14. #include <stdio.h>   
  15. #define MAX_LINE 80   
  16. #define MY_MQ_ID 1233   
  17. /*消息结构体的一般形式如下:  
  18.   typedef struct  
  19.   {  
  20.     long type;   //用于存放消息代码,必须位于首位  
  21.     char message[ LENGHT+1 ];  
  22.   }MSG_TYPE_T;  
  23.  */  
  24. typedef struct  
  25. {   
  26.     long type;     
  27.     float fval;   
  28.     unsigned int uival;   
  29.     char strval[ MAX_LINE+1 ];   
  30. }MY_TYPE_T;   
  31. int main(  )   
  32.     {   
  33.         int msgid,ret;   
  34.         //create the message queue with the id MY_MQ_ID   
  35.         msgid=msgget( MY_MQ_ID,0666|IPC_CREAT );   
  36.         if( msgid>=0 )   
  37.              printf( "Created a Message Queue,message queue identifier is %d\n",msgid );   
  38.         //modify the size of message queue   
  39.         struct msqid_ds buf;   
  40.         ret=msgctl( msgid,IPC_STAT,&buf );   
  41.         printf( "The origianl size of queue is %d\n",buf.msg_qbytes );   
  42.            
  43.         buf.msg_qbytes=4096;   
  44.         ret=msgctl( msgid,IPC_SET,&buf );   
  45.         if( ret==0 )   
  46.             printf( "Size sucessfully changed for queue,message queue identifier is %d\n",msgid );   
  47.         //send a message   
  48.         MY_TYPE_T myMessage;   
  49.         myMessage.type=1L;   //消息的类型,msgrcv会用到   
  50.         myMessage.fval=128.256;   
  51.         myMessage.uival=512;   
  52.         strncpy( myMessage.strval,"This is a test.\n",MAX_LINE );   
  53.         ret=msgsnd( msgid,( struct msgbuf* )&myMessage,sizeof( MY_TYPE_T ),0 ); //0是消息旗标   
  54.         if( ret!=-1 )   
  55.             printf( "Message send successfully.\n" );   
  56.         //read a message   
  57.         MY_TYPE_T recMessage;   
  58.         ret=msgrcv( msgid,( struct msgbuf* )&recMessage,sizeof(MY_TYPE_T),1,0 );//这个地方Message Type要和欲接受的消息类型相同   
  59.         if( ret!=-1 )   
  60.             {   
  61.                 printf( "\nRead a message from the queue\n" );   
  62.                 printf( "Message Type:%ld\n",recMessage.type );   
  63.                 printf( "Float value:%f\n",recMessage.fval );   
  64.                 printf( "Uint value:%d\n",recMessage.uival );   
  65.                 printf( "String value:%s\n",recMessage.strval );   
  66.             }   
  67.         //destroy a message queue   
  68.         ret=msgctl( msgid,IPC_RMID,NULL );   
  69.         if( ret!=-1 )   
  70.             printf( "Message queue %d sucessfully removed.\n",msgid );   
  71.            
  72.         return 0;   
  73.     }   
  74. /*还有很多实际创建时的细节,可以通过man进行查找  
  75.   使用命令来查看IPC队列:  
  76.   ipcs -q  
  77.   ipcs -q -i $msgid  
  78.   ipcrm -q $msgid  
  79.  */  

相关内容