一 回顾
1 创建的有名管道时候 并不会产生fifo 而是在调用open函数 的时候才会
2 通过两个无血缘关系的进程 分别对有名管道读和写
3 读的时候没有数据 是因为有名管道没有数据
二 消息队列 的概述
消息的队列就是消息的链表 存放在内核态中
1 特定格式就是以链表的方式存在
2 每个节点都可以作为发送和接收的中间过渡方式。
3 因为链表的灵活 读取顺序可以打乱
4 并且每个链表都有独立的标识符 用于区分类型
1 msgget函数
看不不清楚的话
成功返回 id
失败 返回-1
key的参数
#include<sys/stat.h>
#include<sys/types.h>
#include<sys/msg.h>
#include<stdio.h>
int main()
{
int res;
res=msgget(IPC_PRVATE,0755);
if(res==-1)
{
printf("msgget is error\n");
return -1;
}
printf("msgget is sueecss ID is %d\n",res);
return 0;
}
./a.out 之后
ipcs -q 查看队列 情况
正常是从0开始 因为我之后试过了 所以不是零开始
再./a.out 之后
返回的 id 值应该累加1
队列也是
感觉这样很麻烦 使用 sytem 函数可以解决
2 system函数
system函数 的 形参 就是一条附加的 指令
也就是 在执行下载代码的同时查看队列情况。
警告 不用 理会 直接 继续
#include<sys/stat.h>
#include<sys/types.h>
#include<sys/msg.h>
#include<stdio.h>
int main()
{
int res;
res=msgget(IPC_PRVATE,0755);
if(res==-1)
{
printf("msgget is error\n");
return -1;
}
printf("msgget is sueecss ID is %d\n",res);
system("ipcs -q");
return 0;
}
3 msgctl函数
用这个实现删除的功能
删除指定队列
比如 94
94 为第一个参数 即为msggt函数返回值
cmd :设置为删除消息队列
*buff: 不需要权限 为 NULL
#include<sys/stat.h>
#include<sys/types.h>
#include<sys/msg.h>
#include<stdio.h>
int main()
{
int res;
res=msgget(IPC_PRVATE,0755);
if(res==-1)
{
printf("msgget is error\n");
return -1;
}
printf("msgget is sueecss ID is %d\n",res);
system("ipcs -q");
msgctl(94,IPC_RMID,NULL);
system("ipcs -q");
return 0;
}
gcc xxx.c
./a.out
94 不存在 验证 成功了
|