Linux10-共享队列

news/2025/3/3 3:23:13/

1.4共享队列

1.4.1共享内存

        内存映射:避免数据的反复读写拷贝,提高了效率。

        内存管理单元MMU:将物理内存与虚拟内存之间架起映射关系


1.创建共享内存                       

int shmget(key_t key,size_t size,int shmflg);

2.建立共享内存和用户空间的映射关系void *shmat(int shmid,const void *shmaddr,int shmflg);

3.写数据

4.读数据
5.解除映射关系int shmdt(const void *shmaddr)
6.删除共享内存int shmctl(int shmid,int cmd,struct shmid_ds *buf)

int shmget(key_t key,size_t size,int shmflg);

功能:根据key值创建共享内存

参数:

        key:IPC的key值

key_t ftok(const char *pathname,int proj_id);

功能:获取一个IPC的key值

参数:

        pathname:路径

        proj_id:项目ID

返回值:

成功:key

失败:-1

        size:共享内存大小(向上取整到页大小的整数倍)4096 PAGE_SIZE

        shmflg:对对象内存的操作  IPC_CREAT | 0664

返回值:

        成功:返回共享内存的ID

        失败:-1

void *shmat(int shmid,const void *shmaddr,int shmflg);
功能:建立内存映射

参数:

        shmid:共享内存的ID

        shmaddr:映射的用户首地址(NULL让操作系统自己去找,返回空间首地址)

        shmflg:!SHM_RDONLY(可读可写)

返回值:

        成功:映射的用户空间首地址

        失败:NULL

int shmdt(const void *shmaddr)
功能:解除用户映射关系,释放用户空间

参数:

        shmaddr:映射的用户首地址(NULL让操作系统自己去找,返回空间首地址)

返回值:

        成功:0

        失败:-1

int shmctl(int shmid,int cmd,struct shmid_ds *buf)
功能:控制共享内存

参数:

        shmid:共享内存的ID

       cmd:IPC_RMID:删除

        buf:NULL不需要使用

返回值:

        成功:0

        失败:-1

指令:ipcs -a查看共享内存 的信息

           ipcrm -s 删除信号量集

           ipcrm -m 删除共享内存

1.5消息队列

获取一个IPC通信的key值key_t ftok(const char *pathname,int proj_id);
创建消息队列int msgget(key_t key,int msgflg);
发送消息int msgsnd(int msqid,void  *msgp,size_t msgsz,int msgflg);  
接受消息ssize_t msgrcv(int msqid,void *msgp,size_t msgsz,long msgtyp,int msgflg);
删除消息队列int msgctl(int msqid,int cmd,struct msqid_ds *buf);
key_t ftok(const char *pathname,int proj_id);
功能:获取ipc的key值

参数:

       pathname:路径

       proj_id:项目ID

返回值:

        成功:key

        失败:-1

int msgget(key_t key,int msgflg);
功能:根据key值创建一个消息队列

参数:

       key:ipc的key值

      msgflg:标志位   IPC_CREAT |0664

返回值:

        成功:消息队列的id号

        失败:-1

int msgsnd(int msqid,void  *msgp,size_t msgsz,int msgflg);  
功能:向消息队列中发送消息

参数:

       msqid:消息队列的ID

        msgp:要发送的消息的结构体首地址

                struct msgbu{

                        long mtype;

                        char mtext[msgsz];

                };

        msgsz:消息体中正文内容大小

        msgflg:标志位:默认0

struct msgbuf msg;

msg.mtype =(大于0的值);

fgets(msg.mtext,sizeof(msg.mtext),stdin);

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

返回值:

        成功:0

        失败:-1

ssize_t msgrcv(int msqid,void *msgp,size_t msgsz,long msgtyp,int msgflg);
功能:从消息队列接受消息

参数:

        msqid:消息队列的ID

        msgp:要存放接收的消息的结构体首地址

                struct msgbu{

                        long mtype;

                        char mtext[msgsz];

                };

        msgsz:接受消息体中正文内容大小

        msgtyp:消息的类型

        msgflg:标志位:默认0

返回值:

        成功:消息队列的id号

        失败:-1

1.6信号灯

不同主机进程间通信:

1.7网络套接字

文件描述符

客户端:

        socket():创建网络套接字

        sendto():发送数据包

        recvfrom():接受数据包

        close():关闭套接字

int socket(int domain,int type,int protocol)
功能:创建一个通信套接字

参数:

domain:ip层协议族

        AF_INET  IP4

        AF_INET6  IP6

type:传输层使用的协议类型

        SOCK_DGRAM UDP

        SOCK_STREAM TCP

protocol:

        0按照默认协议返回值

返回值:

成功:返回套接字

失败:-1

size_t  sendto(int sockfd,const void *buf,sizeof_t len,int flags,const struct sockaddr *dest_addr,socklen_t addrlen);
功能:向通信套接字发送数据

参数:

sockfd:套接字

buf:要发送的数据的首地址

len:发送的数据的大小

flags:默认方式 0

dest_addr:保存接受方地址信息的指针

.sin_port = htons(50000)//

.sin_addr.s_adde =inet_addr("ip地址")//将地址转为un int  inet_ntoa(int 转char)

addrlen:接收方地址变量的大小

返回值:

成功:实际发送的字节数

失败:-1

服务端:

        socket()

        bind():绑定服务器当前主机的身份(IP+PORT)

        recvfrom():接收

        sendto():发送

        close():关闭

bind(int sockfd,const struct sockaddr *addr,socklen_t addrlen)
功能:绑定当前主机的ip和进程的端口

参数:

 sockfd:套接字

addr:自己信息的地址

addrlen:地址信息的大小

返回值:

成功:0

失败:-1

 ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
                        struct sockaddr *src_addr, socklen_t *addrlen);
功能:从套接字接受数据

参数:

sockfd:套接字

buf:存储接收到的数据的位置的首地址

len:期待接收到的字节数

flags::默认方式:0
src_addr:送发地址信息的首地址

addrlen:送发方地址变量的大小

返回值:

成功:返回接收到的字节数

失败:-1


http://www.ppmy.cn/news/1576192.html

相关文章

mysqldump 参数详解

mysqldump 是一个用于备份 MySQL 数据库的工具。它可以生成一组 SQL 语句,这些语句可以用来重现原始数据库对象定义和表数据。以下是一些常用的 mysqldump 参数及其详细解释: 常用参数 基本参数 --host=host_name, -h host_name: 指定 MySQL 数据库主机地址,默认为 localh…

【湖北省计算机信息系统集成协会主办,多高校支持 | ACM出版,EI检索,往届已见刊检索】第二届边缘计算与并行、分布式计算国际学术会议(ECPDC 2025)

第二届边缘计算与并行、分布式计算国际学术会议(ECPDC 2025)将于2025年4月11日至13日在中国武汉盛大召开。本次会议旨在为边缘计算、并行计算及分布式计算领域的研究人员、学者和行业专家提供一个高水平的学术交流平台。 随着物联网、云计算和大数据技术…

Kibana:Spotify Wrapped 第二部分:深入挖掘数据

作者:来自 Elastic Philipp Kahr 我们将比以往更深入地探究你的 Spotify 数据并探索你甚至不知道存在的联系。 在由 Iulia Feroli 撰写的本系列的第一部分中,我们讨论了如何获取 Spotify Wrapped 数据并在 Kibana 中对其进行可视化。在第 2 部分中&#…

AI人工智能机器学习之神经网络

1、概要 本篇学习AI人工智能机器学习之神经网络,以MLPClassifier和MLPRegressor为例,从代码层面讲述最常用的神经网络模型MLP。 2、神经网络 - 简介 在 Scikit-learn 中,神经网络是通过 sklearn.neural_network 模块提供的。最常用的神经网…

【pytest框架源码分析三】pluggy源码分析之hook注册调用流程

pluggy的hook调用,最重要的就是使用了__call__魔法函数,这个函数能够在我们调用实例时,自动调用这个函数,无需自己手动调用。 前面介绍了各个类的方法,这里简述下pluggy的调用流程(主要介绍主流程&#xff…

从【人工智能】到【计算机视觉】,【深度学习】引领的未来科技创新与变革

前几天偶然发现了一个超棒的人工智能学习网站,内容通俗易懂,讲解风趣幽默,简直让人欲罢不能。忍不住分享给大家,点击这里立刻跳转,开启你的AI学习之旅吧! 前言 – 人工智能教程https://www.captainbed.cn/l…

大型语言模型技术对比:阿里Qwen qwq、DeepSeek R1、OpenAI o3与Grok 3

1. 引言 在人工智能(AI)领域中,大型语言模型(Large Language Models,简称LLM)近年来取得了显著的突破。从早期的GPT-3到如今的各种高级模型,这些技术不仅推动了自然语言处理(NLP&am…

JavaScript算法-合并两个有序链表

合并两个有序链表 描述 将两个已按升序排列的链表合并为一个新的升序链表,并返回该链表。 示例: 输⼊:1->3->5, 2->4->6 输出:1->2->3->4->5->6前置知识 递归链表 思路 使⽤递归的方式来实现&…