消息队列,这个可是鼎鼎大名,经常在某些地方看见大家那个膜拜,那个,嗯,那个。。。

那就给个完整的例子,大家欣赏就行,我一直认为不用那个,嗯@

这个队列的最大作用就是进程间通信,你要非搞个持久化,那也行,随你高兴喽!

——————————————————————————————————————

// 进程间通信,通过消息队列

//msgqueue-server.c

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <errno.h>

#include <unistd.h>

#include <sys/msg.h>

#include <signal.h>

#define MSG_FILE "/etc/passwd"

struct msg_form

{

long mtype;

char mtext[256];

};

static sig_atomic_t run =1;

void sigint(int signum)

{

if (SIGINT==signum)

{

run = 0;

}

}

int main()

{

signal(SIGINT, sigint);

int msqid;

key_t key;

struct msg_form msg;

int len;

if (0>(key=ftok(MSG_FILE, 'z')))

{

perror("ftok error!\n");

exit(1);

}

printf("MSG -server key is %0x\n", key);

if (-1==(msqid=msgget(key, IPC_CREAT|0777)))

{

perror("msgget error!\n");

exit(1);

}

printf("msqid is %0x\n", msqid);

printf("pid is %0x\n", getpid());

while (run)

{

len = msgrcv(msqid, &msg, 256, 888, IPC_NOWAIT);

if (0<len)

{

printf("MSG -server receive msg type is %0x\n", (unsigned int)msg.mtype);

printf("MSG -server receive msg is %s\n", msg.mtext);

msg.mtype = 999;

sprintf(msg.mtext, "Hello, I'm server %0x\n", getpid());

msgsnd(msqid, &msg, sizeof(msg.mtext), 0);

}

}

printf("MSG -server quit!\n");

if (-1==msgctl(msqid, IPC_RMID, 0))

{

printf("msqid %0x is rmed with error %d %s\n", msqid, errno, strerror(errno));

exit(1);

}

return 0;

}

// msgqueue-client.c

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <errno.h>

#include <unistd.h>

#include <sys/msg.h>

#include <signal.h>

#define MSG_FILE "/etc/passwd"

struct msg_form

{

long mtype;

char mtext[256];

};

int main()

{

int msqid;

key_t key;

struct msg_form msg;

int isnd, len;

if (0>(key=ftok(MSG_FILE, 'z')))

{

perror("ftok error!");

exit(1);

}

printf("MSG -client key is %0x\n", key);

if (-1==(msqid=msgget(key, 0777)))

{

perror("msgget error");

exit(1);

}

printf("msqid is %0x\n", msqid);

printf("pid is %0x\n", getpid());

msg.mtype = 888;

sprintf(msg.mtext, "Hello, I'm client %0x\n", getpid());

isnd = msgsnd(msqid, &msg, sizeof(msg.mtext), IPC_NOWAIT);

if (0==isnd)

{

len = msgrcv(msqid, &msg, 256, 999, 0);

if (0<len)

{

printf("MSG -client receive msg type is %0x\n", (unsigned int)msg.mtype);

printf("MSG -client receive msg is %s\n", msg.mtext);

}

}

return 0;

}

// result

# ./msgqueue-server &
[1] 2588
MSG -server key is 7a011886
msqid is 28000
pid is a1c

# ./msgqueue-client &
[2] 2592
MSG -client key is 7a011886
msqid is 28000
pid is a20
MSG -server receive msg type is 378
MSG -server receive msg is Hello, I'm client a20

MSG -client receive msg type is 3e7
MSG -client receive msg is Hello, I'm server a1c

[2]+ Done ./msgqueue-client

e# jobs
[1]- Running ./msgqueue-server &

# fg 1
./msgqueue-server
^CMSG -server quit!

Finally:

用好了,还是挺强大的啊

linux 消息队列的更多相关文章

  1. linux消息队列编程实例

    转自:linux 消息队列实例 前言: 消息队列就是一个消息的链表.可以把消息看作一个记录,具有特定的格式以及特定的优先级.对消息队列有写权限的进程可以向其中按照一定的规则添加新消息:对消息队列有读权 ...

  2. LINUX消息队列实战之一

    前言 能说能抄能论皆不算,能写能打才是真功夫. 唠叨 反正我也是一个孤独的程序猿,多说一些奇奇怪怪的唠叨也无妨,第一次写消息队列,书本的东西和实战很不同,根据实战总结的一些注意事项会和大家分享,也敲打 ...

  3. linux 消息队列的限制

    消息队列的系统限制 作者:冯老师,华清远见嵌入式学院讲师. 消息队列是System V的IPC对象的一种,用于进程间通信,会受到系统的限制,本文主要描述了三个限制.第一:议个消息的最大长度:第二:消息 ...

  4. linux消息队列通信

    IPC机制 进程间通信机制(Inter Process Communication,IPC),这些IPC机制的存在使UNIX在进程通信领域手段相当丰富,也使得程序员在开发一个由多个进程协作的任务组成的 ...

  5. Linux消息队列应用

    #include"sys/types.h" #include "sys/msg.h" #include "unistd.h" #includ ...

  6. linux消息队列操作

    对消息队列的操作无非有以下三种类型: 1. 打开或创建消息队列消息队列的内核持续性要求每一个消息队列都在系统范围内相应唯一的键值,所以,要获得一个消息队列的描写叙述字,仅仅需提供该消息队列的键值就可以 ...

  7. linux消息队列的使用

    消息队列 *消息队列是内核地址空间中的内部链表,通过内核在各个进程之间传递的内容.消息顺序发送到消息队列中,每个消息队列都有IPC标识符唯一地进行标识. msgbuf结构 struct msgbuf{ ...

  8. Linux消息队列

    #include <stdio.h> #include <sys/types.h> #include <sys/ipc.h> #include <sys/ms ...

  9. Linux 消息队列编程

    消息队列.信号量以及共享内存被称作 XSI IPC,它们均来自system V的IPC功能,因此具有许多共性. 键和标识符: 内核中的每一种IPC结构(比如信号量.消息队列.共享内存)都用一个非负整数 ...

随机推荐

  1. UWP WebView 禁用缩放

    只要加入一行 css 样式就行了 html, body { -ms-content-zooming:none; }   MSDN:https://msdn.microsoft.com/library/ ...

  2. Java List根据对象的某个属性合并list

    package com.test; import java.util.ArrayList; import java.util.List; public class FileTest { public ...

  3. matplotlib等高线图-【老鱼学matplotlib】

    等高线图是在地理课中讲述山峰山谷时绘制的图形,在机器学习中也会被用在绘制梯度下降算法的图形中. 因为等高线的图有三个信息:x, y以及x,y所对应的高度值. 这个高度值的计算我们用一个函数来表述: # ...

  4. 我是如何用redis做实时订阅推送的

    前阵子开发了公司领劵中心的项目,这个项目是以redis作为关键技术落地的.       先说一下领劵中心的项目吧,这个项目就类似京东app的领劵中心,当然图是截取京东的,公司的就不截了...   其中 ...

  5. vscode断点调试本地客户端文件

    一.安装chrome,安装vscode,打开vscode编辑器,安装插件Debugger for Chrome 二.新建文件 1.目录结构 . ├── index.html ├── index.js ...

  6. centos安装svn并创建版本库配置用户分组权限

    1.设置aliyun安装源// 本步骤非必须, 使用aliyun安装源后, 执行yum update速度明显提升 wget -O /etc/yum.repos.d/CentOS-Base.repo h ...

  7. Java-IO流之输入输出流基础示例

    一.理论: 1.什么是输入输出? 输入输出的对象是数据,数据的存储区域是磁盘或者光盘等设备,我们知道还有一个存储数据的空间----内存,其中磁盘的速度比较慢,内存的速度比较快,把数据读入内存的动作称作 ...

  8. C语言一个程序的存储空间

    按区域划分: 堆区:自动分配内存区.//堆栈段 栈区:手动分配内存区.//堆栈段 全局(静态)区:静态变量和全局变量.//数据段(读写) 常量区:存放const全局变量和字符串常量.//数据段(只读) ...

  9. C++中继承与抽象类

    继承语法格式如下: class 子类名称 : 继承方式(public private protected 三种) 父类名称 纯虚函数格式: virtual 返回值类型 函数名(参数列表)= 0:含有纯 ...

  10. python hashlib模块 md5加密 sha256加密 sha1加密 sha512加密 sha384加密 MD5加盐

      python hashlib模块   hashlib hashlib主要提供字符加密功能,将md5和sha模块整合到了一起,支持md5,sha1, sha224, sha256, sha384, ...