一、System V 消息队列

有一个队列,队列存放各种消息。每个进程可以把数据封存在消息中,再放入队列。每个进程都可以拿到消息队列,再从中取出/放入消息。

消息队列也有管道一样的不足,就是每个消息的最大长度是有上限的(MSGMAX),每个消息队列的总的字节数是有上限的(MSGMNB),系统上消息队列的总数也有一个上限(MSGMNI)。

二、msgget函数

. msgget函数原型:用于创建一个新的消息队列或访问一个已存在的消息队列

#include <sys/msg.h>
int msgget(key_t key, int msgflg);

注意:

msgid = msgget(1234, 0);  //按照原有权限打开该消息队列

1. 测试代码:

#include <unistd.h>
#include <sys/msg.h>
#include <stdlib.h>
#include <stdio.h>int main()
{int msgid;msgid = msgget(1234, 0666 | IPC_CREAT);if(msgid == -1){perror("msgget");exit(EXIT_FAILURE);}printf("msgget succ\n");printf("msgget = %d\n", msgid);return 0;
}

输出结果:


2. 测试代码:

#include <unistd.h>
#include <sys/msg.h>
#include <stdlib.h>
#include <stdio.h>int main()
{int msgid;msgid = msgget(IPC_PRIVATE, 0666);if (msgid == -1){perror("msgget");exit(EXIT_FAILURE);}printf("msgget succ\n");printf("msgget = %d\n", msgid);return 0;
}

输出结果:


3. 测试代码:

#include <unistd.h>
#include <sys/msg.h>
#include <stdlib.h>
#include <stdio.h>int main()
{int msgid;msgid = msgget(1234, 0400 | IPC_CREAT);if (msgid == -1){perror("msgget");exit(EXIT_FAILURE);}printf("msgget succ\n");printf("msgget = %d\n", msgid);msgid = msgget(1234, 0600 | IPC_CREAT);if (msgid == -1){perror("msgget");exit(EXIT_FAILURE);}    return 0;
}

输出结果:

三、msgsnd函数

#include <sys/msg.h>
int msgctl(int msqid, int cmd, struct msqid_ds *buf);
#include <unistd.h>
#include <sys/msg.h>
#include <stdlib.h>
#include <stdio.h>
#include <malloc.h>int main(int argc, const char *argv[])
{int msgid;msgid = msgget(1234, 0);if (msgid == -1){perror("msgget");exit(EXIT_FAILURE);}printf("msggget succ\n");printf("msgid = %d\n", msgget);struct msqid_ds buf;msgctl(msgid, IPC_STAT, &buf);printf("mode = %o\n", buf.msg_perm.mode);printf("bytes = %ld\n", buf.__msg_cbytes);printf("msg_qnum = %d\n", (int)buf.msg_qnum);printf("msg_qbytes = %d\n", (int)buf.msg_qbytes);return 0;
}

输出结果:


#include <unistd.h>
#include <sys/msg.h>
#include <stdlib.h>
#include <stdio.h>
#include <malloc.h>int main(int argc, const char *argv[])
{int msgid;msgid = msgget(1234, 0);if (msgid == -1){perror("msgget");exit(EXIT_FAILURE);}printf("msggget succ\n");printf("msgid = %d\n", msgget);struct msqid_ds buf;sscanf("666", "%o", (unsigned int *)&buf.msg_perm.mode);msgctl(msgid, IPC_SET, &buf);return 0;
}

输出结果:

四、msgsnd函数

msgsnd函数原型:把一条消息添加到消息队列中

#include <sys/msg.h>
int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);

参数:

  • msgid:有msgget函数返回的消息队列标识码
  • msgp:是一个指针,指针指向准备发送的消息
  • msgsz:是msgp指向的消息长度,这个长度不含保存消息类型的那个long int长整型
  • msgflg:控制着当前消息队列满或到达系统上限时将要发生的事情

1. 测试代码:

程序1:

//msg_stat.c
#include <unistd.h>
#include <sys/msg.h>
#include <stdlib.h>
#include <stdio.h>
#include <malloc.h>int main(int argc, const char *argv[])
{int msgid;msgid = msgget(1234, 0);if (msgid == -1){perror("msgget");exit(EXIT_FAILURE);}printf("msggget succ\n");printf("msgid = %d\n", msgget);struct msqid_ds buf;msgctl(msgid, IPC_STAT, &buf);printf("mode = %o\n", buf.msg_perm.mode);printf("bytes = %ld\n", buf.__msg_cbytes);printf("msg_qnum = %d\n", (int)buf.msg_qnum);printf("msg_qbytes = %d\n", (int)buf.msg_qbytes);return 0;
}

程序2:

#include <unistd.h>
#include <sys/msg.h>
#include <stdlib.h>
#include <stdio.h>
#include <malloc.h>int main(int argc, char *argv[])
{if (argc != 3){fprintf(stderr, "Usage:%s<bytes> <type>\n", argv[0], argv[1]);exit(EXIT_FAILURE);}int len = atoi(argv[1]);int type = atoi(argv[2]);int msgid;msgid = msgget(1234, 0);if (msgid == -1){perrro("msgget");exit(EXIT_FAILURE);}struct msgbuf *ptr;ptr(struct msgbuf*) malloc(sizeof(long) + len);ptr->mtype = type;if (msgsnd(msgid, ptr, len, 0) < 0) //阻塞方式{perrro("msgsnd");exit(EXIT_FAILURE);}return 0;
}

输出结果:

System V 消息队列相关推荐

  1. linux进程间通信:system V消息队列

    文章目录 基本介绍 编程接口 代码实例 消息队列的发送和接收 消息队列中的消息对象的属性控制 基本介绍 支持不同进程之间以消息(messages)的形式进行数据交换,消息能够拥有自己的标识,且内核使用 ...

  2. System V消息队列

    简介 这篇笔记中介绍了消息队列的基本知识和Posix消息队列.这篇笔记主要学习记录System V消息队列,并对比两个消息队列. System V消息队列是更早的一个消息队列的实现.Posix消息队列 ...

  3. Linux网络编程之System V消息队列

    System V消息队列函数: #include<sys/types.h> #include<sys/ipc.h> #include<sys/msg.h> int ...

  4. System V 消息队列概念以及相关函数(msgget、msgsnd、msgrcv、msgctl)介绍

    System V 消息队列 消息队列是半双工的通信方式 1.1 创建一个消息队列 消息队列的特点:消息只能一条的读取,不能多读取,也不能少读取,每条消息有一个类型,可以按照消息的类型读取 创建或者打开 ...

  5. (P26)system v消息队列:msgsnd函数 ,msgrcv函数

    文章目录 1.msgsnd函数 2.msgrcv函数 1.msgsnd函数 功能:把一条消息添加到消息队列中原型:int msgsnd(int msqid, const void *msgp, siz ...

  6. 06.System V 消息队列

    1.概述 System V消息队列使用消息队列标识符(message queue identifier)标识.具有足够特权的任何进程都可以往一个给定队列放置一个消息,具有足够特权的任何进程都可以从一个 ...

  7. system V消息队列的使用

    最近在学习网络,主要是<UNIX网络编程>这本书,现在给大家分享以下我在学习消息队列这一部分的心得和体会,如果有不足之处希望大家批评指正. 大家知道linux中支持Posix消息队列和Sy ...

  8. Linux进程通信之System V消息队列

    System V消息队列是Open Group定义的XSI,不属于POSIX标准.System V IPC的历史相对很早,在上个世70年代后期有贝尔实验室的分支机构开发,80年代加入System V的 ...

  9. 细说linux IPC(十):system V 消息队列

    [版权声明:尊重原创,转载请保留出处:blog.csdn.net/shallnet 或 .../gentleliu,文章仅供学习交流,请勿用于商业用途] system V消息队列和posix消息队列类 ...

最新文章

  1. 关于ValueError: Unknown projection ‘3d‘报错的解决方法
  2. win8下Python学习——搭建web.py框架
  3. linux每日命令,日常整理linux常用命令大全(收藏)
  4. PingingLab传世经典系列《CCNA完全配置宝典》-5.8 静态NAT
  5. 《SAS编程与数据挖掘商业案例》学习笔记之十五
  6. 双足机器人简单步态生成
  7. matlab 电力系统分析 毕设,基于MATLAB的P-Q分解法电力系统潮流计算毕业设计
  8. (八)构建一个Docker容器来训练Deep Fake Autoencoders
  9. Oracle的expdp导出、impdp导出命令
  10. 西门子1200伺服步进FB块程序 含触摸屏程序,SCL写的FB块,中文注释详细
  11. 苹果CMSv10系统标签,仿站必备
  12. 用树莓派实现宽带多次拨号,带宽叠加
  13. Android 压力测试 手机重启测试
  14. matlab中inf怎么判断,MATLAB中Inf或inf表示()、NaN或nan表示()、nargout表示()。
  15. SIM900A GPRS GSM 基础知识
  16. 学游戏原画都需要掌握哪些软件
  17. 针对前端初级学者,如何在windows下搭建react-native环境详细教程
  18. YOLOV7详细解读(一)网络架构解读
  19. matlab逐步积分,第17章 隐式逐步积分法.ppt
  20. c++ 语法错误 : 缺少“;”(在“*”的前面)

热门文章

  1. Swift基础语法: 30 - Swift的基类, 子类, 重写, 重写方法, 重写属性, 防止重写
  2. datetime2 数据类型
  3. Eclipse for android 中设置java和xml代码提示功能(转)
  4. 使用快捷键,快到极致
  5. VS2010 运行库设置
  6. 计算机网络 实验教案,《计算机网络》实验教案.pdf
  7. epoll nio区别_【总结】两种 NIO 实现:Selector 与 Epoll
  8. python pool_派松水潭(Python Pool)
  9. 怎么用PHP建立购物网站,如何使用PHP建设一个购物网站
  10. Jmeter BeanShell学习(一) - BeanShell取样器(二)