LINUX 学习笔记
--IPC 之 消息队列(缓冲)的使用【.1】
Written by Pingf
【最近在整linux相关的东西,索性记录一下,好东西比不过烂笔头啊。。。】
作为一种进程间的通讯机制,本质上就是要进行两个进程间的通讯。
所以简言之就是一发一收!
这里献给出简单的代码,
发送部分的代码,
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
Code
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/msg.h>
#include <sys/ipc.h>
//注:为了简洁,对错误的检测不做处理
#define MAXMSG 512
struct my_msg
{
long int my_msg_type;
char some_text[MAXMSG];
}msg;
//这是用来说明消息类型的结构
int main (int argc, char *argv[])
{
int msgid;//这个变量是用来告诉操作系统该消息队列ipc标识,
//而操作系统根据这个表示检索到对应的消息队列
// char buffer[BUFSIZ];
//有本书上说什么消息队列不能像共享内存那般直接操作必须获取到消息结构体[如前面定义的msg]
//后在复制到一个缓冲区进行操作,但目前我的理解不是这样的,不能直接操作指的是不能直接对所在的
//内存进行操作,但已经复制到暂存的结构体了,就可以操作了.[仅是个人理解不一定正确]
msgid=msgget( 1234,0666|IPC_CREAT );
//获取(创建)消息队列,创建时要指明消息的关键字(Key),这里用的是1234,也可以通过ftok获取随机值
//后面的参数用来指明权限(对应0666)与动作(对应IPC_CREAT),在这里不再赘述.
//-->
//这里要说明的是Key和msgid的关系,
//操作系统通过ipcs结构中的一个指针找到具体的ipc[n],这是一个指针数组,n就是msgid
//ipc[n]再指向具体的消息队列
//而消息队列中有一专门的结构体中定义了Key
//总的来说,msgid是让操作系统看的,而Key是用户来定义的用来区别不同的消息队列的.
//ipcs-->ipcs[n]-->消息队列{Key,
.}
while(1)
{
puts( "Enter some text:" );
fgets( msg.some_text,BUFSIZ,stdin );
//从标准输入获取一行数据
msg.my_msg_type=1;
//消息类型设置,接受过程可以根据此值选择性的摘取队列上的消息
//要注意的是,这里的队列并不是简单的队列,其本来的面目是linux内核实现的双链表,可以进行复杂
//操作
//不仅消息队列中的消息如此,队列的发送者以及接受者的pid也都是以双链表的形式存储的
msgsnd( msgid,&msg,MAXMSG,0 );
//将msg中的消息挂接到消息队列上,
//msgid告知系统具体的ipc的值,MAXMSG为消息的长度,0为标志为若设置成IPC_NOWAIT,
//消息队列满等状态时不发送消息立即返回-1
if( strncmp( msg.some_text,"end",3 )==0)
{
break;
}
//当检测到队列中有”end”字符传,则终止!
}
return(0);
}
上面的代码估计好多书都copy过,好像出自比本叫什么beginning linux programming的书中。。。
没事儿手闲,就敲了一遍,顺带加上点个人的理解,不一定正确。。。