文档章节

linux两个服务消息队列通信

青春无极限
 青春无极限
发布于 2017/03/27 16:18
字数 361
阅读 50
收藏 0
②消息队列通信

 

send.c

 

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>

#define MAX_TEXT 512

 

/*用于消息收发的结构体--my_msg_type:消息类型,some_text:消息正文*/
struct my_msg_st
{
 long int my_msg_type;
 char some_text[MAX_TEXT];
};

 

int main()
{
 int running = 1;//程序运行标识符
 struct my_msg_st some_data;
 int msgid;//消息队列标识符
 char buffer[BUFSIZ];


 /*创建与接受者相同的消息队列*/
 msgid = msgget((key_t)1234, 0666 | IPC_CREAT);
 if (msgid == -1) 
 {
  fprintf(stderr, "msgget failed with error: %d/n", errno);
  exit(EXIT_FAILURE);
 }

 

 /*向消息队列中发送消息*/
 while(running) 
 {
  printf("Enter some text: ");
  fgets(buffer, BUFSIZ, stdin);
  some_data.my_msg_type = 1;
  strcpy(some_data.some_text, buffer);
  if (msgsnd(msgid, (void *)&some_data, MAX_TEXT, 0) == -1) 
  {
   fprintf(stderr, "msgsnd failed/n");
   exit(EXIT_FAILURE);
  }
  if (strncmp(buffer, "end", 3) == 0) 
  {
   running = 0;
  }
 }
 exit(EXIT_SUCCESS);
}

 

receive.c

 

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>

 

/*用于消息收发的结构体--my_msg_type:消息类型,some_text:消息正文*/
struct my_msg_st
{
 long int my_msg_type;
 char some_text[BUFSIZ];
};

 

int main()
{
 int running = 1;//程序运行标识符
 int msgid; //消息队列标识符
 struct my_msg_st some_data; 
 long int msg_to_receive = 0;//接收消息的类型--0表示msgid队列上的第一个消息

 

 /*创建消息队列*/
 msgid = msgget((key_t)1234, 0666 | IPC_CREAT);
 if (msgid == -1) 
 {
  fprintf(stderr, "msgget failed with error: %d/n", errno);
  exit(EXIT_FAILURE);
 }

 

 /*接收消息*/
 while(running) 
 {
  if (msgrcv(msgid, (void *)&some_data, BUFSIZ,msg_to_receive, 0) == -1) 
  {
   fprintf(stderr, "msgrcv failed with error: %d/n", errno);
   exit(EXIT_FAILURE);
  }
  printf("You wrote: %s", some_data.some_text);
  if (strncmp(some_data.some_text, "end", 3) == 0) 
  {
   running = 0;
  }
 }

 

 /*删除消息队列*/
 if (msgctl(msgid, IPC_RMID, 0) == -1) 
 {
  fprintf(stderr, "msgctl(IPC_RMID) failed/n");
  exit(EXIT_FAILURE);
 }
 exit(EXIT_SUCCESS);
}

 

 

© 著作权归作者所有

青春无极限
粉丝 2
博文 127
码字总数 70524
作品 0
卢湾
程序员
私信 提问
Linux下常用轻量级队列服务比较

Linux IPC: IPC进程间通信(Inter-Process Communication)就是指多个进程之间相互通信,交换信息的方法。 系统消息队列功能是这些方法中的其中一种。使用此队列不需要额外安装服务,是系统内...

苗雨顺
2014/03/24
848
1
Heartbeat的可靠消息通信实现过程分析

Heartbeat项目是Linux-HA工程的一个组成部分,它实现了一个高可用集群系统。心跳服务和集群通信是高可用集群的两个关键组件,在Heartbeat项目里,由heartbeat模块实现了这两个功能。这篇文章...

zt371
2009/05/07
905
0
深刻理解Linux进程间通信(IPC)

linux下的进程通信手段基本上是从Unix平台上的进程通信手段继承而来的。而对Unix发展做出重大贡献的两大主力AT&T的贝尔实 验室及BSD(加州大学伯克利分校的伯克利软件发布中心)在进程间通信...

墙头草
2010/11/19
364
0
linux上的进程通信学习笔记

参考资料 <> http://man7.org/linux/man-pages/man2/open.2.html https://www.cnblogs.com/52php/p/5840229.html 在Android中的Handler的Native层研究文章中研究一下一把Linux中的匿名管道的......

JerryLin123
2018/09/09
33
0
6种Linux进程间的通信方式

进程的概念 进程是操作系统的概念,每当我们执行一个程序时,对于操作系统来讲就创建了一个进程,在这个过程中,伴随着资源的分配和释放。可以认为进程是一个程序的一次执行过程。 进程通信的...

问题终结者
2018/04/16
23
0

没有更多内容

加载失败,请刷新页面

加载更多

SpringBoot中 集成 redisTemplate 对 Redis 的操作(二)

SpringBoot中 集成 redisTemplate 对 Redis 的操作(二) List 类型的操作 1、 向列表左侧添加数据 Long leftPush = redisTemplate.opsForList().leftPush("name", name); 2、 向列表右......

TcWong
今天
4
0
排序––快速排序(二)

根据排序––快速排序(一)的描述,现准备写一个快速排序的主体框架: 1、首先需要设置一个枢轴元素即setPivot(int i); 2、然后需要与枢轴元素进行比较即int comparePivot(int j); 3、最后...

FAT_mt
昨天
4
0
mysql概览

学习知识,首先要有一个总体的认识。以下为mysql概览 1-架构图 2-Detail csdn |简书 | 头条 | SegmentFault 思否 | 掘金 | 开源中国 |

程序员深夜写bug
昨天
10
0
golang微服务框架go-micro 入门笔记2.2 micro工具之微应用利器micro web

micro web micro 功能非常强大,本文将详细阐述micro web 命令行的功能 阅读本文前你可能需要进行如下知识储备 golang分布式微服务框架go-micro 入门笔记1:搭建go-micro环境, golang微服务框架...

非正式解决方案
昨天
7
0
前端——使用base64编码在页面嵌入图片

因为页面中插入一个图片都要写明图片的路径——相对路径或者绝对路径。而除了具体的网站图片的图片地址,如果是在自己电脑文件夹里的图片,当我们的HTML文件在别人电脑上打开的时候图片则由于...

被毒打的程序猿
昨天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部