目录
打开或创建消息队列
消息队列的控制
发送消息
举个栗子
#include
int msgget(key_t key, int flag);
//返回:成功返回内核中消息队列的标识ID,出错返回-1
参数:
key:用户指定的消息队列的键值;
flag:IPC_CREAT、IPC_EXCL等权限组合;
若创建消息队列,key可指定键值,也可将之设置为IPC_PRIVATE。若打开进行查询,则key不能为0必须是一个非零的值否则是查询不到的。
#include
int msgctl(int msgid, int cmd, struct msqid_ds *buf);
//返回:成功返回0,出错返回-1
参数:
msgid:消息队列ID;
buf:消息队列属性指针;
cmd:
1.IPC_STAT:获取消息的属性,取出队列msqid_ds结构,并将其存放到uf指向的结构体中;
2. IPC_SET:设置属性;
3. IPC_RMID:删除队列。
#include
int msgsnd(int msgqid, const void *ptr, size_t nbytes, int flag);
//返回值:成功0,出错-1
ptr:
struct mymsg{
long mytype; //消息类型
char mtext[512]; //发送的数据
};
在Linux中,消息的最大长度是4056字节,其中mytype是4字节;
flag:0为阻塞,IPC_NOWAIT为非阻塞;
源码如下:
#include
#include
#include
#include
typedef struct{
long type; //消息类型
int start; //消息数据本身 包括 start 和 end
int end;
}MSG;
int main(int argc, char *argv[]){
if(argc < 2){
printf("usage: %s key\n", argv[0]);
exit(1);
}
key_t key = atoi(argv[1]);
printf("key: %d\n", key);
//创建消息队列
int msq_id;
if((msq_id = msgget(key, IPC_CREAT | IPC_EXCL | 0777)) < 0){
perror("msgget error");
}
printf("msq id: %d\n", msq_id);
//定义要发送的消息
MSG m1 = {4, 4, 400};
MSG m2 = {2, 2, 200};
MSG m3 = {1, 1, 100};
//发送消息到消息队列
if(msgsnd(msq_id, &m1, sizeof(MSG) - sizeof(long), IPC_NOWAIT) < 0){
perror("msgsnd error");
}
if(msgsnd(msq_id, &m2, sizeof(MSG) - sizeof(long), IPC_NOWAIT) < 0){
perror("msgsnd error");
}
if(msgsnd(msq_id, &m3, sizeof(MSG) - sizeof(long), IPC_NOWAIT) < 0){
perror("msgsnd error");
}
//发送消息后获取消息队列中的消息总数
struct msqid_ds ds;
if(msgctl(msq_id, IPC_STAT, &ds) < 0){
perror("msgctl error");
}
printf("msg total: %ld\n", ds.msg_qnum);
exit(0);
}
运行截图如下:
查看ipc
删除他!