进程间通信——消息队列

1、消息队列的创建
msgget(key_t key,//相当于文件名
int flag);//打开:0,创建:IPC_CREAT|0644
返回值:消息队列的id。相当于文件描述符

查看IPC对象
ipcs -q:查看系统所有的创建的消息队列
删除IPC对象:
ipcrm -Q key

系统中最多创建多少个消息队列(MSGNMI);
cat /proc/sys/kernel/msgmni
每个消息队列的长度是有上限的()
cat /proc/sys/kernel/msgmax

一条消息最多能装多少字节()
cat /proc/sys/kernel/msgmnb


2、往消息队列里面发送数据:
msgsnd(int id ,//msgget的返回值
const void *msgp,//要发送的消息在哪里
size_t len,//消息的字节数,不包括channel的大小
int flag);//失败返回-1,成功返回0
消息的结构:
struct msgbuf{
long channel;//消息类型(通道号),必须>=1
char buf【1000】;//代表自己要发送的消息的数据结构,类型自定义
}

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/ipc.h>
#include <sys/msg.h>

struct msgbuf {//关于消息的结构体
        long type;
        char mtext[1000];
};

int main(int argc,char *argv[])//命令行的第二个参数就是通道号
{
        if(argc!=2){//命令行参数
                fprintf(stderr,"usage:%s type\n",argv[0]);
                exit(1);
        }
        int id=msgget(1234,0);//id为msgget的返回值
        if(id==-1) perror("msgget"),exit(1);
        struct msgbuf mb;
        memset(&mb,0x00,sizeof mb);
        mb.type=atoi(argv[1]);//通道号
        printf("msg:");
        fgets(mb.mtext,999,stdin);//向消息队列中输入内容
        int r=msgsnd(id,&mb,strlen(mb.mtext),0);
        if(r==-1) perror(",msgsnd"),exit(1);//根据返回值判断消息发送是否成功
}


3、从消息队列中取数据:
msgrcv(int id,
void *msgp,//取出的消息放在这里
size_t len,//装消息的地方的大小,不包括类型
long mytype//取哪个类型的数据
int flag);//0,有就取走,没有就等待
先发送消息,再接受消息,如果在相应的通道没有消息,则接收消息就一直等待,知道有了可供接收的消息。

struct msgbuf {
        long type;
        char mtext[1000];
};

int main(int argc,char *argv[])
{
        if(argc!=2){
                fprintf(stderr,"usage:%s type\n",argv[0]);
                exit(1);
        }
        int id=msgget(1234,0);
        if(id==-1) perror("msgget"),exit(1);
        struct msgbuf mb;
        memset(&mb,0x00,sizeof mb);
        if(msgrcv(id,&mb,1000,atoi(argv[1]),0)==-1)//接收数据
                perror("msgrcv"),exit(1);
        printf("%s\n",mb.mtext);//输出消息队列中的数据
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值