赞
踩
1 创建的有名管道时候 并不会产生fifo 而是在调用open函数 的时候才会
2 通过两个无血缘关系的进程 分别对有名管道读和写
3 读的时候没有数据 是因为有名管道没有数据
消息的队列就是消息的链表 存放在内核态中
1 特定格式就是以链表的方式存在
2 每个节点都可以作为发送和接收的中间过渡方式。
3 因为链表的灵活 读取顺序可以打乱
4 并且每个链表都有独立的标识符 用于区分类型
看不不清楚的话
成功返回 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");//不成功 提示 error return -1; } printf("msgget is sueecss ID is %d\n",res);//成功返回 id return 0; }
./a.out 之后
ipcs -q 查看队列 情况
正常是从0开始 因为我之后试过了 所以不是零开始
再./a.out 之后
返回的 id 值应该累加1
队列也是
感觉这样很麻烦 使用 sytem 函数可以解决
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; }
用这个实现删除的功能
删除指定队列
比如 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 不存在 验证 成功了
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。