Linux环境进程间通信----系统 V 消息队列(二)
一、消息队列是一条由消息连接而成的链表,它保存在内核中,通过消息队列的引用标示符来访问。
二、消息队列不同于管道,通信的两个进程可以是完全无关的进程,它们之间不需要约定同步的方法。只要消息队列存在并且有存放消息的空间,发送进程就可以向消息队列中存放消息,并且可以在接收进程开始之前终止其执行。但是使用管道通信的进程,无论是匿名管道还是有名管道,通信的两个进程都必须是正在运行的进程。这一点是消息队列的优点。
三、编写两个程序,第一个是从消息队列中接收消息,第二个程序则发送消息。每一个消息是用户输入的任意字符串,字符串“end”表示输入结束。
1 msqRcv.c:
/*
* msqRcv.c
*
* Created on: Aug 4, 2013
* Author: root
*/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h> struct my_msg{
long int my_msg_type;
char text[BUFSIZ];
} msgbuf; int main(){
int running = ;
int msgid;
long int msg_to_receive = ;
msgid=msgget((key_t), |IPC_CREAT); //msgid就是消息队列引用标识符
if(msgid == -){
printf("msgget failed.\n");
exit();
} while(running){
if(msgrcv(msgid, (void*)&msgbuf, BUFSIZ, msg_to_receive,) == -){
printf("msgrcv failed.\n");
exit();
}
printf("You wrote:%s", msgbuf.text);
if(strncmp(msgbuf.text, "end", ) == ){
running = ;
}
}
if(msgctl(msgid, IPC_RMID, ) == -){
printf("msgctl(IPC_RMID) failed!\n");
exit();
} return ;
}
2 msqSend.c:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h> struct my_msg{
long int my_msg_type;
char text[BUFSIZ];
} msgbuf; int main(){
int running = ;
int msgid;
msgid = msgget((key_t), |IPC_CREAT);
if(msgid == -){
printf("msgget failed.\n");
exit();
}
//msgctl(msgid, IPC_RMID, 0);
while(running){
printf("Enter some text:");
fgets(msgbuf.text, BUFSIZ, stdin);
msgbuf.my_msg_type = ;
if(msgsnd(msgid, (void*)&msgbuf, BUFSIZ, ) == -){
printf("msgsend failed.\n");
exit();
}
if(strncmp(msgbuf.text, "end", ) == ){
running = ;
}
}
return ;
}
Linux环境进程间通信----系统 V 消息队列(二)的更多相关文章
- (转)Linux环境进程间通信----系统 V 消息队列列
转:http://www.ibm.com/developerworks/cn/linux/l-ipc/part3/ 消息队列(也叫做报文队列)能够克服早期unix通信机制的一些缺点.作为早期unix通 ...
- Linux环境进程间通信(三):消息队列
linux下进程间通信的几种主要手段: 管道(Pipe)及有名管道(named pipe):管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允 ...
- linux网络编程之system v消息队列(二)
今天继续学习system v消息队列,主要是学习两个函数的使用,开始进入正题: 下面则开始用代码来使用一下该发送函数: 在运行之前,先查看一下1234消息队列是否已经创建: 用上次编写的查看消息队列状 ...
- 进程间通信 System V 消息队列
1.msgget (key_t ket,int flag) ; //创建一个新的消息队列或者访问一个已存在的消息队列 2.msgsnd(int msid, const void *ptr ,size_ ...
- Linux进程间通信(System V) --- 消息队列
消息队列 IPC 原理 消息队列是消息的链式队列,如下图为消息队列的模型.整个消息队列有两种类型的数据结构. 1.msqid_ds 消息队列数据结构:描述整个消息队列的属性,主要包括整个消息队列的权限 ...
- Linux下进程间通信方式——使用消息队列
一.什么是消息队列 消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法. 每个数据块都被认为含有一个类型,接收进程可以独立地接收含有不同类型的数据结构.我们可以通过发送消息来避免命名管道的 ...
- linux c编程:System V消息队列一
消息队列可以认为是一个消息链表,System V 消息队列使用消息队列标识符标识.具有足 够特权的任何进程都可以往一个队列放置一个消息,具有足够特权的任何进程都可以从一个给定队列读出一个消息.在某个进 ...
- <转>Linux环境进程间通信(三)
原文链接:http://www.ibm.com/developerworks/cn/linux/l-ipc/part3/index.html 原文内容: 消息队列(也叫做报文队列)能够克服早期unix ...
- Linux环境进程间通信(四):信号灯
linux下进程间通信的几种主要手段: 管道(Pipe)及有名管道(named pipe):管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允 ...
随机推荐
- 使用node-static运行vue打包文件dist
vue打包后的文件dist,如果想上线之前查看效果,方法如下: npm install -g node-static 进入到dist文件夹,运行static命令 打开上面地址
- iframe中涉及父子页面跨域问题
什么是跨域? 跨域,指的是浏览器不能执行其他网站的脚本.它是由浏览器的同源策略造成的,是浏览器施加的安全限制.所谓同源是指相同的域名.协议和端口,只要其中一项不同就为跨域. 举几个例子: http:/ ...
- selenium自动化之验证,判断总结(持续更新)
API命令 1,is_displayed() 例子:driver.find_element_by_css_selector("#id").is_displayed() 该元素是否可 ...
- 77、tensorflow手写识别基础版本
''' Created on 2017年4月20日 @author: weizhen ''' #手写识别 from tensorflow.examples.tutorials.mnist import ...
- Python selenium web UI之Chrome 与 Chromedriver对应版本映射表及下载地址和配置(windows, Mac OS)
浏览器及驱动下载 进行web UI 自动化时,需要安装浏览器驱动webdriver,Chrome浏览器需要安装chromedriver.exe 驱动,Firefox需安装 geckodriver.ex ...
- (转)SQL Server 数据类型映射
SQL Server 数据类型映射 SQL Server 和 .NET Framework 基于不同的类型系统. 例如,.NET Framework Decimal 结构的最大小数位数为 28,而 S ...
- sql server 与 oracle的区别(转)
--1.数据类型不同. --sql server 的数据类型:int ,smallint ,char,varchar,nchar,nvarchar,ntext,datetime,smalld ...
- JDK动态代理源码剖析
关键代码: 1.Proxy.newInstance: private static final Class<?>[] constructorParams = { InvocationHan ...
- 用Emacs进行Java开发
用Emacs进行Java开发 */--> code {color: #FF0000} pre.src {background-color: #002b36; color: #839496;} 用 ...
- python面试题之如何解决验证码的问题,用什么模块,听过哪些人工打码平台?
如何解决验证码的问题,用什么模块,听过哪些人工打码平台? PIL.pytesser.tesseract模块 平台的话有:(打码平台特殊,不保证时效性) 云打码 挣码 斐斐打码 若快打码 超级鹰 本文首 ...