system-V 消息队列
system-V ipc 特点(消息对队列 信号量 共享内存)
- 独立于进程 //即system-V的ipc不存在于程序内部,程序销毁,ipc任然存在(个人理解)
- 没有文件名和文件描述符
- IPC对象具有key和ID ,key用来唯一标识ipc对象(文件名),ID用来控制IPC对象(文件描述符)//IPC对象即 system-V的消息对队列 信号量 共享内存
消息队列用法
- 定义一个唯一key // ftok(),获取一个key
- 构造消息对象 // msgget(),创建/获取消息队列ID
- 发送特定类型消息 // msgsnd(),发送消息到消息队列,阻塞 非阻塞
- 接收特定类型消息 //msgrcv(),从消息队列中接收消息,阻塞 非阻塞 截断
- 删除消息队列 // msgctl(),设置或获取消息队列的相关属性
msgsend.c
#include<stdio.h>
#include<sys/ipc.h>
#include <unistd.h>
#include<stdlib.h>
#include <sys/types.h>
#include<sys/msg.h>
#include<string.h>
#define BUFFER_SIZE 512
struct message{
long msg_typ;
char msg_text[BUFFER_SIZE];
};
int main()
{
int qid;
key_t key;
struct message msg;
if((key = ftok("../",11)) == -1)
{
printf("ftok error\r\n");
exit(1);
}
if((qid = msgget(key,IPC_CREAT|0666)) == -1)
{
printf("message error\r\n");
exit(1);
}
printf("open queue %d\r\n",qid);
while(1)
{
printf("enter some message to queue: ");
if((fgets(msg.msg_text,BUFFER_SIZE,stdin)) == NULL)
{
puts("no message");
exit(1);
}
msg.msg_typ = getpid();
if((msgsnd(qid,&msg,strlen(msg.msg_text),0)) < 0)
{
printf("mseeage posted error\r\n");
exit(1);
}
if(strncmp(msg.msg_text,"quit",4) == 0)
{
break;
}
}
return 0;
}
msgrcv.c
#include<stdio.h>
#include<sys/ipc.h>
#include <unistd.h>
#include<stdlib.h>
#include <sys/types.h>
#include<sys/msg.h>
#include<string.h>
#define BUFFER_SIZE 512
struct message{
long msg_typ;
char msg_text[BUFFER_SIZE];
};
int main()
{
int qid;
key_t key;
struct message msg;
if((key = ftok("../",11)) == -1)
{
printf("ftok error\r\n");
exit(1);
}
if((qid = msgget(key,IPC_CREAT|0666)) == -1)
{
printf("message error\r\n");
exit(1);
}
printf("open queue %d\r\n",qid);
do{
memset(msg.msg_text,0,BUFFER_SIZE);
if(msgrcv(qid,(void*)&msg,BUFFER_SIZE,0,0) < 0)
{
printf("msgrcv,error\r\n");
exit(1);
}
printf("the message from msgsend process %ld : %s \r\n",msg.msg_typ,msg.msg_text);
}while(strncmp(msg.msg_text,"quit",4));
if((msgctl(qid, IPC_RMID, NULL)) < 0)
{
printf("msgctl error\r\n");
exit(1);
}
return 0;
}