一、消息队列是一条由消息连接而成的链表,它保存在内核中,通过消息队列的引用标示符来访问。

二、消息队列不同于管道,通信的两个进程可以是完全无关的进程,它们之间不需要约定同步的方法。只要消息队列存在并且有存放消息的空间,发送进程就可以向消息队列中存放消息,并且可以在接收进程开始之前终止其执行。但是使用管道通信的进程,无论是匿名管道还是有名管道,通信的两个进程都必须是正在运行的进程。这一点是消息队列的优点。

三、编写两个程序,第一个是从消息队列中接收消息,第二个程序则发送消息。每一个消息是用户输入的任意字符串,字符串“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 消息队列(二)的更多相关文章

  1. (转)Linux环境进程间通信----系统 V 消息队列列

    转:http://www.ibm.com/developerworks/cn/linux/l-ipc/part3/ 消息队列(也叫做报文队列)能够克服早期unix通信机制的一些缺点.作为早期unix通 ...

  2. Linux环境进程间通信(三):消息队列

    linux下进程间通信的几种主要手段: 管道(Pipe)及有名管道(named pipe):管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允 ...

  3. linux网络编程之system v消息队列(二)

    今天继续学习system v消息队列,主要是学习两个函数的使用,开始进入正题: 下面则开始用代码来使用一下该发送函数: 在运行之前,先查看一下1234消息队列是否已经创建: 用上次编写的查看消息队列状 ...

  4. 进程间通信 System V 消息队列

    1.msgget (key_t ket,int flag) ; //创建一个新的消息队列或者访问一个已存在的消息队列 2.msgsnd(int msid, const void *ptr ,size_ ...

  5. Linux进程间通信(System V) --- 消息队列

    消息队列 IPC 原理 消息队列是消息的链式队列,如下图为消息队列的模型.整个消息队列有两种类型的数据结构. 1.msqid_ds 消息队列数据结构:描述整个消息队列的属性,主要包括整个消息队列的权限 ...

  6. Linux下进程间通信方式——使用消息队列

    一.什么是消息队列 消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法.  每个数据块都被认为含有一个类型,接收进程可以独立地接收含有不同类型的数据结构.我们可以通过发送消息来避免命名管道的 ...

  7. linux c编程:System V消息队列一

    消息队列可以认为是一个消息链表,System V 消息队列使用消息队列标识符标识.具有足 够特权的任何进程都可以往一个队列放置一个消息,具有足够特权的任何进程都可以从一个给定队列读出一个消息.在某个进 ...

  8. <转>Linux环境进程间通信(三)

    原文链接:http://www.ibm.com/developerworks/cn/linux/l-ipc/part3/index.html 原文内容: 消息队列(也叫做报文队列)能够克服早期unix ...

  9. Linux环境进程间通信(四):信号灯

    linux下进程间通信的几种主要手段: 管道(Pipe)及有名管道(named pipe):管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允 ...

随机推荐

  1. MySQL timestampdiff 和 timestampadd 的用法

    在应用时,经常要使用这两个函数TIMESTAMPDIFF和TIMESTAMPADD. 一,TIMESTAMPDIFF 语法: TIMESTAMPDIFF(interval,datetime_expr1 ...

  2. java Wrapper包装类

    什么是包装类?为什么需要包装类? 这是大家要了解的 对于java中的基本数据类型我们如果想要把当当做类来使用怎么办呢? 如果想要对这些基本数据类型直接调用一些方法来操作的话 怎么做呢? 由以上就产生了 ...

  3. 抓包工具tcpdump用法说明--1

    本文目录: 1.1 tcpdump选项 1.2 tcpdump表达式 1.3 tcpdump示例 tcpdump采用命令行方式对接口的数据包进行筛选抓取,其丰富特性表现在灵活的表达式上. 不带任何选项 ...

  4. Chosen 的 optgroup 第一级单击的时候选择二级的全部

    相关环境 及 版本 Chosen (v1.6.2) https://harvesthq.github.io/chosen/ jQuery (v1.8.3) 官网 http://jquery.com/ ...

  5. Mysql任意读取客户端文件复现

    本机执行 python rogue_mysql_server.py 目标机器上连接本机数据库 mysql -u root -p -h 本机IP mysql -h 192.168.250.132 -ur ...

  6. git清理工作区

    git clean -f 这将删除所有未被追踪的文件 git rev-list

  7. docker x509: certificate has expired or is not yet valid

    系统环境:centos 6.5 内核版本:2.6.32-696.1.1.el6.x86_64 程序版本:Docker version 1.7.1, build 786b29d/1.7.1 问题:下载镜 ...

  8. Laravel4 最佳学习代码以及资料推荐(转)

    https://github.com/andrew13/Laravel-4-Bootstrap-Starter-Site 充分展现了Laravel的强大之处 Laravel虽然上手难度会比其他框架大很 ...

  9. linux性能查看调优

    一 linux服务器性能查看1.1 cpu性能查看1.查看物理cpu个数:cat /proc/cpuinfo |grep "physical id"|sort|uniq|wc -l ...

  10. Notepad++中直接运行python

    点击进入幕布视图浏览 https://mubu.com/doc/a8VGCUfqqw 一.使用Notepad++编辑python文件,并直接运行 1.用notepad++打开python文件.或者新建 ...