进程通信--消息队列 听课笔记

随内核持续
键值
#include <sys/types.h>
#include <sys/ipc.h>
    key_t ftok(char *pathname, char proj)

pathname 文件名
proj 项目名, 不为0即可
返回文件名对应的键值

打开消息队列
#include <sys/types.h>
#include <sys/ipc.h>
#inlcude <sys/msg.h>
    int msgget(key_t key, int msgflg)

key: 键值, 由ftok获得-->key参数为IPC_PRIVATE则创建新消息队列
msgflg: 标志位
  IPC_CREATE 创建新的消息队列
  IPC_EXCL 与IPC_CREAT一同使用, 如果消息队列已经存在, 则返回错误
  IPC_NOWAIT 非阻塞
返回值: 返回与key对应的消息队列描述字

发送消息
#include <sys/types.h>
#include <sys/ipc.h>
#inlcude <sys/msg.h>
    int msgsnd(int msqid, strcut msgbuf *msgp, int msgsz, int msgflg)

struct msgbuf{
    long mtype;//消息的类型
    char *mtext;//消息数据的首地址
}


接收消息
#include <sys/types.h>
#include <sys/ipc.h>
#inlcude <sys/msg.h>
    int msgrcv(int msqid, strcut msgbuf *msgp, int msgsz, long msgtyp, int msgflg)
//从msgid代表的消息队列中读取一个msgtyp类型的消息
//存储在msgp指向的msgbuf结构中, 队列中这条消息将被删除


示例
#include <sys/types.h>
#include <sys/msg.h>
#include <unistd.h>

struct msg_buf
    {
        int mtype;
        char data[255];
    };
 
int main()
{
        key_t key;
        int msgid;
        int ret;
        struct msg_buf msgbuf;
 
        key=ftok("/tmp/2",'a');
        printf("key =[%x]\n",key);
        msgid=msgget(key,IPC_CREAT|0666); /*通过文件对应*/

        if(msgid==-1)
        {
                printf("create error\n");
                return -1;
        }
 
        msgbuf.mtype = getpid();
        strcpy(msgbuf.data,"test haha");
        ret=msgsnd(msgid,&msgbuf,sizeof(msgbuf.data),IPC_NOWAIT);
        if(ret==-1)
        {
                printf("send message err\n");
                return -1;
        }
 
        memset(&msgbuf,0,sizeof(msgbuf));
        ret=msgrcv(msgid,&msgbuf,sizeof(msgbuf.data),getpid(),IPC_NOWAIT);
        if(ret==-1)
        {
                printf("recv message err\n");
                return -1;
        }
        printf("recv msg =[%s]\n",msgbuf.data);
 
}

你可能感兴趣的:(数据结构,C++,c,C#)