Linux消息队列编程实例

来源:互联网 发布:知日偶像百度云 编辑:程序博客网 时间:2024/05/22 11:44
/*  创建消息队列msgget( )  调整消息队列的参数msgctl(msgid,IPC_SET,struct msqid_ds* )  发送一条消息msgsnd( )  接受一条消息msgrcv( )  移除一条消息msgctl( msgid,IPC_RMID,NULL ) *//*创建一个消息队列,并调整其大小,发送一条消息  再取出该条消息,最后移除该消息队列 */#include <sys/types.h>#include <sys/ipc.h>#include <sys/msg.h>#include <stdio.h>#define MAX_LINE 80#define MY_MQ_ID 1233/*消息结构体的一般形式如下:  typedef struct  {    long type;   //用于存放消息代码,必须位于首位    char message[ LENGHT+1 ];  }MSG_TYPE_T; */typedef struct{    long type;      float fval;    unsigned int uival;    char strval[ MAX_LINE+1 ];}MY_TYPE_T;int main(  )    {        int msgid,ret;        //create the message queue with the id MY_MQ_ID        msgid=msgget( MY_MQ_ID,0666|IPC_CREAT );        if( msgid>=0 )             printf( "Created a Message Queue,message queue identifier is %d/n",msgid );        //modify the size of message queue        struct msqid_ds buf;        ret=msgctl( msgid,IPC_STAT,&buf );        printf( "The origianl size of queue is %d/n",buf.msg_qbytes );                buf.msg_qbytes=4096;        ret=msgctl( msgid,IPC_SET,&buf );        if( ret==0 )            printf( "Size sucessfully changed for queue,message queue identifier is %d/n",msgid );        //send a message        MY_TYPE_T myMessage;        myMessage.type=1L;   //消息的类型,msgrcv会用到        myMessage.fval=128.256;        myMessage.uival=512;        strncpy( myMessage.strval,"This is a test./n",MAX_LINE );        ret=msgsnd( msgid,( struct msgbuf* )&myMessage,sizeof( MY_TYPE_T ),0 ); //0是消息旗标        if( ret!=-1 )            printf( "Message send successfully./n" );        //read a message        MY_TYPE_T recMessage;        ret=msgrcv( msgid,( struct msgbuf* )&recMessage,sizeof(MY_TYPE_T),1,0 );//这个地方Message Type要和欲接受的消息类型相同        if( ret!=-1 )            {                printf( "/nRead a message from the queue/n" );                printf( "Message Type:%ld/n",recMessage.type );                printf( "Float value:%f/n",recMessage.fval );                printf( "Uint value:%d/n",recMessage.uival );                printf( "String value:%s/n",recMessage.strval );            }        //destroy a message queue        ret=msgctl( msgid,IPC_RMID,NULL );        if( ret!=-1 )            printf( "Message queue %d sucessfully removed./n",msgid );                return 0;    }/*还有很多实际创建时的细节,可以通过man进行查找  使用命令来查看IPC队列:  ipcs -q  ipcs -q -i $msgid  ipcrm -q $msgid */


原创粉丝点击