Linux 进程通信-消息队列

头文件:

#include<sys/types.h>
#include <sys/msg.h>

发消息端:

void msgque_test(){
    key_t key = ftok("..", 1);  //如果要确保key_t值不变,要么确保ftok的文件不被删除,要么不用ftok,指定一个固定的key_t值

    int msqid = msgget(key, IPC_CREAT | 0666);      // Create msgque
    print("ID:", msqid);

    mymsg msg{123, "this is msg!"};
    int ret_value = msgsnd(msqid, &msg, sizeof(msg), IPC_NOWAIT);   //send msg
    print(ret_value);

//    getc(stdin);

    msg.msgtype = 111;
    memcpy(msg.msgtext, "123456abc", 9);
    msgsnd(msqid, &msg, sizeof(msg), IPC_NOWAIT);

    getc(stdin);

    cout << msgctl(msqid, IPC_RMID, NULL);

}
  • 函数原型: int msgget(key_t key, int msgflg)
  • 头文件:#include <sys/types.h> #include <sys/ipc.h>  #include <sys/msg.h>
  • 参数解析
    • 第一个参数是一个标识数据结构唯一的key键值,可以给IPC_PRIVATE让内核自动给,也可以自己调用ftok函数绑定一个
    • 第二个参数是创建消息队列的参数,有IPC_CREAT 和 IPC_EXCL
      • 单独使用IPC_CREAT,如果该消息队列已经存在(就是该key_t对象已经拿去被创建过一个队列了),打开该队列并返回,如果不存在,就创建一个返回
      • 单独使用IPC_EXCL没有意义
      • 两个参数一起使用(IPC_CREAT | IPC_EXCL),如果该队列存在,出错返回,如果不存在创建一个返回,也就是说这样使用一定会获得一个新队列
  • 返回值,成功返回标志消息队列的唯一的一个int,失败返回-1


取消息:

void msgque_test(){
    key_t key = ftok(".", 1);

    int msqid = msgget(key, IPC_CREAT|0666);
    print("ID:", msqid);

    mymsg rcv;
    cout << "rcv len:" << msgrcv(msqid, &rcv, sizeof(mymsg), 0, IPC_NOWAIT) << endl;

    print(rcv.msgtype, rcv.msgtext);
}

更多:进程间通信(二)—消息队列传送门:http://www.cnblogs.com/lenomirei/p/5642575.html

猜你喜欢

转载自blog.csdn.net/m_n_n/article/details/79833769