头文件:
#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