当前位置:网站首页>【进程间通信】消息队列
【进程间通信】消息队列
2022-08-02 14:13:00 【白U】
复习:
- 管道:有名管道/无名管道
mkfifo fifo :创建
写入管道的数据都在内存中。
有名管道可以在任意进程间使用,而无名管道只能在父子进程间。(半双工) - 信号量:正数,原子操作( P-1)获取资源,(V+)释放资源。
- 信号量的值赋为0,1是二值信号量。
- 计数信号量,(如一个试衣间有三个,那么用掉一个就剩下2个,该信号量出事就定义为3,用掉后就变为2。
- 共享内存(没有进程同步)(想读就读,想写就写)
(没有对进程的操作进行控制)
管道就实现了同步,因此,共享内存需要信号量进行控制。
消息队列
头文件:#include<sys/msg.h>
struct mess
{
long type; 消息类型>=1
//自定义
}
接收的消息,必须是发送消息中已经定义的消息类型 ,每次都会读取同意消息类型的所有消息。
读不到消息,也可以阻塞,自我控制。
没有删除消息,也不影响。
头文件
- msg.h
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<sys/msg.h>
struct mess
{
long int type;
char buff[32];
};
int main()
{
//权限
int msgid = msgget((key_t)1234, IPC_CREAT | 0600);
if (msgid == -1)
{
exit(-1);
}
//发送消息
- main.c
int msgsnd(int msqid, const void *msqp, size_t msqsz, int msqflg);
msgsnd()成功返回 0, 失败返回-1
msqsz: 指定 mtext 中有效数据的长度
msqflg:一般设置为 0 可以设置 IPC_NOWAI
//消息类型(0号消息,没有,代表可以读取任意消
msgrcv(msgid,&dt,32,0,0);
struct mess dt;
// dt.type = 1; //消息类型为1;
dt.type = 2;
strcpy(dt.buff, "hello2");
msgsnd(msgid, &dt, 32, 0);//发送消息
exit(0);
}
收消息
test.c
struct mess dt;
//msgrcv(msgid,&dt,2,1,0); //接收消息&dt,会将消息自动传到buff中
//消息类型(0号消息,没有,代表可以读取任意消
msgrcv(msgid,&dt,32,0,0);
printf("read:%s\n",dt.buff);
exit(0);
}


边栏推荐
猜你喜欢
随机推荐
change the available bandwidth of tcp flow dynamically in mininet
Evaluation multipath weswood congestion control on ns3
数学工具-desmos 图形曲线
mysql学习总结 & 索引
许多代码……
分布式一致性协议-Raft
3.用户上传头像
光栅区域衍射级数和效率的规范
关于分布式的一些知识点
audio console无法连接到RPC服务
2342. 数位和相等数对的最大和 哈希优化
深入理解Mysql索引底层数据结构与算法
unity 和C# 一些官方优化资料
Detailed introduction to drawing complex surfaces using the plot_surface command
极简式 Unity 获取 bilibili 直播弹幕、SC、上舰、礼物等 插件
冷读123
2. Log out, log in state examination, verification code
3. User upload avatar
What are IPV4 and IPV6?
Software Testing Basics (Back)









