消息队列
消息队列提供了一个从一个进程向另外一个进程发送一块数据的方法
每个数据块都被认为是有一个类型,接收者进程接收的数据块可以有不同的类型值
消息队列也有管道一样的不足,就是每个消息的最大长度是有上限的(MSGMAX),每个消息队列的总的字节数是有上限的(MSGMNB),系统上消息队列的总数也有一个上限(MSGMNI)
对比:
管道:流管道 消息:有边界
先进先出 可以后进入、先出来
消息大小三大限制
cat /proc/sys/kernel/msgmax最大消息长度限制
cat /proc/sys/kernel/msgmnb消息队列总的字节数
cat /proc/sys/kernel/msgmni消息条目数
//common.c
#include"common.h"
#if 0
struct msgbuf{
long mtype; /* message type, must be > 0 */
char mtext[MAX_BYTE]; /* message data */
};
#endif
struct msgbuf buf_read;
struct msgbuf buf_write;
struct msgbuf buf_read_ser;
struct msgbuf buf_write_ser;
int clinet(int msgid)
{
int flag = 0;
int ret;
pid_t pid = fork();
if(pid <0)
{
printf("fork error ....\n");
}
if(pid > 0)
{
*(int*)(buf_write.mtext) = pid;
while((fgets(buf_write.mtext+4,MAX_BYTE,stdin)) != NULL)
{
buf_write.mtype = 1;
ret = msgsnd(msgid,&buf_write,MAX_BYTE,IPC_NOWAIT);
if(ret == -1)
{
printf("msg snd error .....\n");
}
printf("<>%s\n",buf_write.mtext+4);
}
}else if(pid == 0)
{
int ret = 0;
int pid = getpid();
while(1)
{
buf_read.mtype = pid;
ret = msgrcv(msgid,&buf_read, MAX_BYTE,pid,0);
if(ret == -1)
{
printf("msgrcv error......\n");
}
//common.h
#ifndef _COMMON_H
#define _COMMON_H
#include<string.h>
#include <sys/msg.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include<stdio.h>
#include<stdlib.h>
#define MAX_BYTE 1024
struct msgbuf{
long mtype; /* message type, must be > 0 */
char mtext[MAX_BYTE]; /* message data */
};
int clinet(int msgid);
int server(int msgid);
#endif
//server.c
#include "common.h"
int main()
{
int msgid = msgget(0x1234,0666|IPC_CREAT);
if(msgid == -1)
{
printf("error.....msg creat....\n");
return -1;
}
printf("server msgid is %d \n",msgid);
server(msgid);
}
//client.c
#include"common.h"
int main()
{
int msgid = msgget(0x1234,0666);
if(msgid == -1)
{
printf("error ...... \n");
return -1;
}
printf("client msgid is %d \n",msgid);
clinet(msgid);
}