消息队列见习

    技术2022-07-11  84

    1,消息队列从本质上讲就是一个链表,一个消息的链表。

    2,消息队列通信主要步骤:

    (1),通过ftok()获取一个键值;

    (2),通过这个键值创建一个消息队列,并将消息队列与键值相关联。通过message get:msgget( )函数来创建。

    (3),操作消息队列:发送消息,message send:msgsnd()与接收消息,receive message:msgrcv().

    (4),删除消息队列:msgctl().

    3,创建消息队列

    # include <sys/types.h>

    # include <sys/ipc.h>

    # include <sys/msg.h>

    int msgget(key_t key, int msgflg);

    msgflg,操作与权限,IPC_CREAT | 0666

    4,发送消息,msgsnd()

    # include <sys/types.h>

    # include <sys/ipc.h>

    # include <sys/msg.h>

    int msgsnd(int msqid, struct msgbuf *msgp, size_t msgsz, int msgflg);

    (1)msqid是msgget()函数返回的消息队列描述符,表示你要把消息队列发送到哪个消息队列里面去。

    (2)msgp是一个指向struct msgbuf 型结构体的指针,表示你要把发送的消息存放到哪种类型的结构体变量中。固定格式的

    struct msgbuf

    {

    long mtype;//消息类型,必须大于0;

    char mtext[消息长度];//消息内容

    };

    (3),msgsz:表示要发送或接收的消息的字节数,即msgbuf中存放消息的mtext数组的长度,通过sizeof即可获得。

    (4),msgflg:折个参数依然是控制函数行为的标志。

    5,接收消息:

    # include <sys/types.h>

    # include <sys/ipc.h>

    # include <sys/msg.h>

    ssize_t msgrcv(int msqid, struct msgbuf *msgp, size_t msgsz, long msgtyp, int msgflg);

    6,删除消息队列:msgctl()

    #include <sys/types.h>

    #include <sys/ipc.h>

    #include <sys/msg.h>

    int msgctl(int msqid, int cmd, struct msqid_ds *buf);

    ① 参数shmid表示要控制的是哪个消息队列,即msgget()函数的返回值;

    ② 参数cmd如果取IPC_RMID就表示删除消息队列,即remove ID。我们一般使用shmctl()函数就是删除消息队列,所以cmd一般都取IPC_RMID,其它参数我们就不看了。PC_RMID的宏值为0,我们在编程的时候可以写宏名也可以直接写宏值,这里直接写宏值好像更方便一点,但含义没有宏名直观。

    ③ 参数struct msqid_ds *是一个结构体指针,同样这个参数一般就写NULL。

     

    举例:

    # include <unistd.h>

    # include <sys/types.h>

    # include <sys/ipc.h>ls

     

    # include <sys/msg.h>

    # include <stdlib.h>

    # include <stdio.h>

    # include <string.h>

     

    struct msgbuf

    {

    long mtype;  /*消息类型,必须大于0 */

    char mtext[1024];    /*消息内容*/

    };

     

    int main(void)

    {

    //获取键值

    int key = ftok(".", 1);

     

    //创建消息队列

    int msgid = msgget(key, IPC_CREAT | 0666);

     

    //发送消息

    struct msgbuf data;

     

    data.mtype = 3;

    strcpy(data.mtext, "i love you");

     

    msgsnd(msgid, &data, 1024, 0);

     

    return 0;

    }

     

    # include <unistd.h>

    # include <sys/types.h>

    # include <sys/ipc.h>

    # include <sys/msg.h>

    # include <stdlib.h>

    # include <stdio.h>

    # include <string.h>

     

    struct msgbuf

    {

    long mtype;  /*消息类型,必须大于0 */

    char mtext[1024];    /*消息内容*/

    };

     

    int main(void)

    {

    //获取键值

    int key = ftok(".", 1);

     

    //打开消息队列

    int msgid = msgget(key, IPC_CREAT);

     

    //接收消息

    struct msgbuf data;

     

    msgrcv(msgid, &data, 1024, 3, 0);

    printf("%s\n", data.mtext);

     

    //删除消息队列

    msgctl(msgid, 0, NULL);

     

    return 0;

    }

    Processed: 0.017, SQL: 9