最近文章更新
- 1966年生产的广州 珠江 SB6-2型 ..
- HD6870/6850全面评测,让你大饱眼..
- 百万现金刚入门 中国7大奢华私人..
- 罕见4G希捷酷鱼系类万转SCSI服务..
- IBM 6x86MX PR333 CPU
- 采用MC68000 CPU的进口老计算机主..
- 1989年IBM-XT机软驱
- BC3型饱和标准电池拆解
- JUKO ST
- Kingston 品牌的CPU
- YAMAHA 719
- intel 30线 内存条
- intel mmx cpu和主板
- 首款xHCI 1.0正式版标准USB 3.0控..
- 《极品飞车:地下狂飙》纹理MOD视..
- USB接口加扩展子卡:影驰神秘GTX..
- 阿里巴巴将发布浏览器 核心不是W..
- 黄仁勋大秀NVIDIA LOGO纹身
- Google Earth上的奇特卫星图片
- 开火!讯景限量版HD 5970详细测试..
相关文章链接
本类文章排行
最新新闻资讯
本周下载排行
- ArcSoft TotalMedia Theatre 3 P..
- Windows 7 Build 7600 16385 RTM..
- 《姗姗来迟软件光盘+飞扬PE工具箱..
- MSDN Windows 7 RTL 7600 Ultima..
- Windows 7 Home Premium (x86) -..
- Windows Virtual PC (x86) - (Mu..
- MSDN Windows 7 Language Pack X..
- Windows 7 Language Pack (x64) ..
- Windows 7 Starter (x86) - DVD ..
- Windows 7 Professional (x86) -..
- Windows 7 Language Pack (x86) ..
- Windows 7 Home Premium (x64) -..
- Windows XP Mode (x86, x64) - (..
- 7127.0.090507-1820_x86fre_clie..
- DMG2ISO
本月下载排行
- ArcSoft TotalMedia Theatre 3 P..
- Windows 7 Build 7600 16385 RTM..
- 《姗姗来迟软件光盘+飞扬PE工具箱..
- MSDN Windows 7 RTL 7600 Ultima..
- MSDN Windows 7 Language Pack X..
- Windows 7 Home Premium (x86) -..
- Windows 7 Language Pack (x64) ..
- Windows 7 Professional (x86) -..
- 7127.0.090507-1820_x86fre_clie..
- Windows 7 Professional (x64) -..
- Windows 7 Starter (x86) - DVD ..
- Windows Virtual PC (x86) - (Mu..
- Windows 7 Ultimate (x64) - DVD..
- Lenovo Windows 7 Ultimate OEM ..
- Windows 7 Home Premium (x64) -..
- 阅览次数: 文章来源: 原文作者: 整理日期: 2010-07-12
消息队列
消息队列
今天完成消息队列的使用。
消息队列类似FIFO,但是可以实现随机查询。
主要函数:msgget,msgsnd,msgrcv,msgctl
实验实现两个进程之间的通信。
一个发送,一个接受。并不需要额外实现进程同步。
源代码来自华清远见:
发送:
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/msg.h>
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#define BUFFER_SIZE 512
struct message
{
long msg_type;
char msg_text[BUFFER_SIZE];
};
int main()
{
int qid;
key_t key;
struct message msg;
//ftok根据不同路径和关键字产生标准的KEY
if((key = ftok(".", 'a')) == -1)
{
perror("ftok");
exit(1);
}
if((qid = msgget(key, IPC_CREAT|0666)) == -1)//创建
{
perror("msgget");
exit(1);
}
printf("open queue %d\n", qid);
while(1)
{
printf("enter some message to the queue:");
if((fgets(msg.msg_text, BUFFER_SIZE, stdin)) == NULL)
{
puts("no message");
exit(1);
}
msg.msg_type = getpid();//消息类型为进程号
if((msgsnd(qid, &msg, strlen(msg.msg_text), 0)) < 0)//发送消息
{
perror("message posted");
exit(1);
}
if(strncmp(msg.msg_text, "quit", 4) == 0)
{
break;
}
}
exit(0);
}
接收:
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/msg.h>
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#define BUFFER_SIZE 512
struct message
{
long msg_type;
char msg_text[BUFFER_SIZE];
};
int main()
{
int qid;
key_t key;
struct message msg;
if((key = ftok(".", 'a')) == -1)
{
perror("ftok");
exit(1);
}
if((qid = msgget(key, IPC_CREAT|0666)) == -1)//创建
{
perror("msgget");
exit(1);
}
printf("open queue %d\n", qid);
do
{
memset(msg.msg_text, 0, BUFFER_SIZE);
if(msgrcv(qid, (void*)&msg, BUFFER_SIZE, 0, 0) < 0)//接收消息
{
perror("msgrcv");
exit(1);
}
printf("the message from process %d : %s", msg.msg_type, msg.msg_text);
}while(strncmp(msg.msg_text, "quit", 4));
if((msgctl(qid, IPC_RMID, NULL)) < 0)//从系统内核移走消息队列
{
perror("msgctl");
exit(1);
}
exit(0);
}
打开两个终端,1号发送,2号接收。