Linux C 消息队列和共享内存

Linux C 进程间的通信——共享内存、消息队列、信号量 早期:有名管道、无名管道、信号,system V IPC:共享内存、消息队列、信号量。除了这六种以外呢其实还有另一种进程间的通信——域通信,不过域通信就要结合TCP或者UDP来操作,基本和管道差不多,这部分有缘再更。 阅读详情
 

版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
http://xufish.blogbus.com/logs/40537374.html

012号与013 号程序,分别是关于消息队列和共享内存的

/*********************程序相关信息*********************
程序编号:012
程序编写起始日期:2008.11.1
程序编写完成日期:2008.11.1
程序修改日期:                                   修改备注:
程序目的:学习linux消息队列通信
所用主要函数:msgget(),msgsnd(),msgrcv(),msgctl()
程序存疑:
程序完成地点: 宿舍内
*********************程序相关信息*********************/
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/msg.h>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
    int pid,msqid;//后者为消息队列识别代号
    struct msgbuf
    {
        long mtype;//消息类型
        char mtext[20];//消息内容
    }send_buf,receive_buf;
    if((msqid=msgget(IPC_PRIVATE,0700))<0)//建立消息队列
    {
        printf("msgget建立消息队列失败。\n");
        exit(1);
    }
    else
        printf("msgget建立消息队列成功,该消息队列识别代号为%d。\n",msqid);
    if((pid=fork())<0)
    {
        printf("fork()函数调用失败!\n");
        exit(2);
    }
    else if(pid>0)//父进程,发送消息到消息队列
    {
        send_buf.mtype=1;
        strcpy(send_buf.mtext,"My test information");
        printf("发送到消息队列的信息内容为:%s\n",send_buf.mtext);
        if(msgsnd(msqid,&send_buf,20,IPC_NOWAIT)<0)//发送send_buf中的信息到msqid 对应的消息队列
        {
            printf("msgsnd消息发送失败。\n");
            exit(3);
        }
        else
            printf("msgsnd消息发送成功。\n");
        sleep(2);
        exit(0);
    }
    else//子进程,从消息队列中接收消息]
    {
        sleep(2);//等待父进程发送消息完成
        int infolen;//读到的信息数据长度
        if((infolen=msgrcv(msqid,&receive_buf,20,0,IPC_NOWAIT))<0)//自消息队列接收信息
        {
            printf("msgrcv读取信息错误。\n");
            exit(4);
        }
        else
            printf("msgrcv读取信息成功。\n");
        printf("自消息队列读取到的内容为%s,共读取%d个字节。\n",receive_buf.mtext,infolen);
        if((msgctl(msqid,IPC_RMID,NULL))<0)//删除msqid对应的消息队列
        {
            printf("msgctl函数调用出现错误。\n");
            exit(5);
        }
        else
        {
            printf("识别代号为%d的消息队列已经被成功删除。\n",msqid);
            exit(0);
        }
    }
}
/*********************程序运行结果*********************
[root@localhost temp]# ./msg
msgget建立消息队列成功,该消息队列识别代号为 98304。
发送到消息队列的信息内容为:My test information
msgsnd消息发送成功。
msgrcv读取信息成功。
自消息队列读取到的内容为My test information,共读取20个字节。
识别代号为98304的消息队列已经被成功删除。
***********************************************************/

/********************* 程序相关信息*********************
程序编号:013
程序编写起始日期:2008.11.1
程序编写完成日期:2008.11.1
程序修改日期:                                   修改备注:
程序目的:学习linux共享内存
所用主要函数:shmget(),shmat(),shmctl(),shmdt()
程序存疑:
程序完成地点: 宿舍内
*********************程序相关信息*********************/
#include<sys/ipc.h>
#include<sys/shm.h>
#include<stdlib.h>
#include<string.h>
#include<stdio.h>
int main()
{
    int pid,shmid;//后者为共享内存识别代号
    char *write_address;
    char *read_address;
    struct shmid_ds dsbuf;
    if((shmid=shmget(IPC_PRIVATE,32,0))<0)//分配共享内存
    {
        printf("shmid共享内存分配出现错误。\n");
        exit(1);
    }
    else
        printf("shmid共享内存分配成功,共享内存识别代号为:%d。\n",shmid);
    if((pid=fork())<0)
    {
        printf("fork函数调用出现错误!\n");
        exit(2);
    }
    else if(pid>0)//父进程,向共享内存中写入数据
    {
        printf("父进程的ID是:%d\n",getpid());
        write_address=(char *)shmat(shmid,NULL,0);//连接共享内存
        if((int)write_address==-1)
        {
            printf("shmat连接共享内存错误。\n");
            exit(3);
        }
        else
        {
            printf("shmat连接共享内存成功。\n");
            strcpy(write_address,"我是写入共享内存的测试数据");//将数据写入共享内存
            printf("写入共享内存的信息为“%s”。\n",write_address);
            if((shmdt((void *)write_address))<0)//断开与共享内存的连接
                printf("shmdt共享内存断开错误。\n");
            else
                printf("shmdt共享内存断开成功。\n");
            sleep(2);
            return;
        }
    }
    else//子进程,从共享内存中读取数据
    {
        sleep(2);//等待父进程写入共享内存完毕
        printf("子进程ID是:%d\n",getpid());
        if((shmctl(shmid,IPC_STAT,&dsbuf))<0)
        {
            printf("shmctl获取共享内存数据结构出现错误。\n");
            exit(4);
        }
        else
        {
            printf("shmctl获取共享内存数据结构成功。\n建立这个共享内存的进程ID是:%d\n",dsbuf.shm_cpid);
            printf("该共享内存的大小为:%d\n",dsbuf.shm_segsz);
            if((read_address=(char *)shmat(shmid,0,0))<0)//连接共享内存
            {
                printf("shmat连接共享内存出现错误。\n");
                exit(5);
            }
            else
            {
                printf("自共享内存中读取的信息为:“%s”。\n",read_address);
                printf("最后一个操作该共享内存的进程ID是:%d\n",dsbuf.shm_lpid);
                if((shmdt((void *)read_address))<0)//断开与共享内存的连接
                {
                    printf("shmdt共享内存断开错误。\n");
                    exit(6);
                }
                else
                    printf("shmdt共享内存断开成功。\n");
                if(shmctl(shmid,IPC_RMID,NULL)<0)//删除共享内存及其数据结构
                {
                    printf("shmctl删除共享内存及其数据结构出现错误。\n");
                    exit(7);
                }
                else
                    printf("shmctl删除共享内存及其数据结构成功。\n");
                exit(0);
            }
        }    
    }
}
/*********************程序运行结果*********************
[root@localhost temp]# ./shm
shmid共享内存分配成功,共享内存识别代号为:1703947。
父进程的ID是:7647
shmat连接共享内存成功。
写入共享内存的信息为“我是写入共享内存的测试数据”。
shmdt 共享内存断开成功。
子进程ID是:7648
shmctl获取共享内存数据结构成功。
建立这个共享内存的进程ID是:7647
该共享内存的大小为:32
自共享内存中读取的信息为:“我是写入共享内存的测试数据”。
最后一个操作该共享内存的进程ID是:7647
shmdt共享内存断开成功。
shmctl删除共享内存及其数据结构成功。
***********************************************************/

linux C 四、进程间通信(有名管道、共享内存、消息队列) 一、有名管道 对应管道文件,可用于任意进程之间进行通信,打开管道时可指定读写方式,通过文件IO操作,内容存放在内存中。 1.1 API #include <unistd.h> #include <fcntl.h> int mkfifo(const char *path, mode_t mode); 成功时返回0,失败时返回EOF path 创建的管道文件路径 mode... 阅读详情

相关推荐

Linux C语言手搓消息队列:共享内存+信号量实现进程通信

消息队列作为进程间通信(IPC)的核心机制,其本质是在不同进程间提供异步、解耦的数据传递通道。其工作原理基于生产者-消费者模型,通过缓冲区暂存消息,实现发送方与接收方的时序解耦。在技术实现层面,Linux系统提供了多种IPC方案,其中共享内存因其零拷贝特性成为最高效的数据共享方式,而信号量则是实现进程同步与互斥的关键原语。将共享内存与信号量结合,能够构建出高性能、线程安全的通信基础设施,这种组合在嵌入式系统、高性能服务器等对底层控制要求严格的场景中具有重要价值。本文聚焦于使用C语言在Linux环境下从零实现

weixin_29194693的博客 232

【转】linux的消息队列与共享内存编程

/*********************程序相关信息********************* 程序编号:012 程序编写起始日期:2008.11.1 程序编写完成日期:2008.11.1 程序修改日期:

yuyin86的专栏 664

linux 进程通信——C语言实现

一.低级通信--信号通信signal.c#include #include #include /*捕捉到信号sig之后,执行预先预定的动作函数*/void sig_alarm(int sig){ printf("---the signal received is %d. /n", sig); signal(SIGINT, SIG_DFL); //SIGINT终端中断信号,SIG_DFL:恢复默认行为,SIN_IGN:忽略信号}int main(){ signal(SIGINT, sig_alarm);//捕

piaojun_pj的专栏 1万+

ubuntu 环境共享内存函数shmget与shmat的使用以及shmid:: Invalid argument错误的原因

用于Linux进程通信共享内存。共享内存函数由shmget、shmat、shmdt、shmctl四个函数组成。 shmget函数原型 shmget(得到一个共享内存标识符或创建一个共享内存对象) 所需头文件 #include #include 函数说明 得到一个共享内存标识符或创建一个共享内存对象并返回共享内存标

a656343072的专栏 1万+

《IO进程线程》利用共享内存实现AB进程读写 利用消息队列实现AB进程随时消息互发8.6

1. A进程写入一个整型,在该整型后,写入一个字符串 2. B进程将共享内存中的整型以及字符串读取出来; 3.要求AB进程做通信 1)A进程发送一句话,B进程接收打印 2)然后B进程发送给A进程一句话,A进程接收打印 3)重复1,2步骤,直到A进程或者B进程收到quit,退出AB进程; 4)在第一题的基础上实现,AB进程能够随时收发数据(附加题)............

qq_60071225的博客 576

Linux下C语言实现进程通信与共享内存编程

通过使用进程通信和共享内存,我们可以在Linux下实现不同进程之间的数据交换和共享。无论是管道通信还是消息队列通信,还是共享内存,都提供了灵活和高效的方式来实现进程间的通信和数据共享。消息队列是一种进程间通信方式,其中的消息具有特定的格式,并且可以按照特定的优先级进行处理。共享内存是一种高效的进程间通信方式,它允许多个进程直接访问同一块内存区域,而无需进行数据的复制。管道是一种最简单的进程间通信方式,它可以在父子进程之间或者具有亲缘关系的进程之间进行通信。系统调用从管道读取数据,并打印出接收到的消息。

YOLO_CODE的博客 339

共享内存和消息队列

共享内存和消息队列

iccoke的博客 1495

基于奥比中光Orbbec Astra Pro与ROS实现实时3D环境建模:orb_slam2实战指南

本文提供了一份详细的实战指南,介绍如何使用奥比中光Orbbec Astra Pro深度摄像头与ROS系统,部署并运行ORB-SLAM2算法,实现实时3D环境建模与定位。内容涵盖从驱动安装、环境配置、算法编译到摄像头标定与性能调优的全流程,旨在帮助开发者快速搭建一套高性价比的视觉SLAM系统。

weixin_29054399的博客 335

【Linux】进程间通信之共享内存/消息队列/信号量

本文介绍了进程间通信中的共享内存,消息队列,信号量,以及IPC资源的组织方式

qq_67582098的博客 1123

Xarray实战:从气象数据到可视化分析的完整流程(附Python代码)

本文详细介绍了使用Xarray库处理气象数据的完整实战流程。针对气象领域常见的NetCDF和GRIB格式,文章从数据读取、坐标操作、智能索引、统计计算到高级可视化,提供了完整的Python代码示例。重点阐述了Xarray如何高效处理高维标记数据,帮助地球科学领域的研究人员将繁琐的数据处理工作转化为高效的分析流水线。

d6e7f8g9h的博客 290

STM32G474 FDCAN滤波器配置与多ID接收实战

本文详细介绍了STM32G474 FDCAN滤波器配置与多ID接收实战,重点解析了掩码过滤和范围过滤两种模式的工作原理及配置步骤。通过实际项目案例展示了如何高效配置多个滤波器实现多ID报文接收,并提供了接收FIFO配置与中断处理的优化策略,帮助开发者提升CAN通信系统的稳定性和实时性。

happy2的博客 875

Linux C/C++ 共享内存配合消息队列与信号量的封装

Linux‘ C/C++ 共享内存配合消息队列+信号量下的封装 一、思路 我所做的服务端demo中分为前置与后置两个服务器,前置做接收信息、发包与解包等处理,后置则包业务的处理,前后置分为两个进程运行,那么彼此要接收到互相发送的信息必然少不了Linux下进程间的通信,而我对共享内存的主要封装思路如下: 现有共享内存A端与B端,两者为同一个共享内存,一个写一个读 创建一个信号量,来实现可读资源与可写资源的P V操作,充当共享内存读写中的缓冲机制 创建一个消息队列, A端共享内存写入后,则往该消息队列发送消

SupriseF的博客 1613

<PLC><汇川>汇川PLC基于EtherCat协议使用转矩模式控制SV630N伺服驱动电机

本系列是关于PLC相关的博文,包括PLC编程、PLC与上位机通讯、PLC与下位驱动、仪器仪表等通讯、PLC指令解析等相关内容。PLC品牌包括但不限于西门子、三菱等国外品牌,汇川、信捷等国内品牌。除了PLC为主要内容外,PLC相关元器件如触摸屏(HMI)、交换机等工控产品,如果有值得记录的内容,也会添加进来。

用沸腾的热血,支付我们的人生吧! 4159

Linux C语言学习 IO:day6 共享内存,信号灯级,消息队列

【1】复习 进程间通信方式 无名管道: 具有亲缘关系的进程 有固定读端fd[0]和写端fd[1] pipe(fd) 在内存中的3-4g的内核空间 管道中没有数据,读阻塞 管道中数据满了,写阻塞, 有名管道: 两个不相干的进程 在文件系统中存在管道文件名 mkfifo->open->read/write O_WRONLY:写阻塞 O_RDONLY:读阻...

haogewudi666的博客 535

杰理外挂flash使用教程(三): 打包提示音到外部flash(2)

本教程详细介绍了提示音制作与程序配置的全流程规范。提示音制作要求包括:英文命名(8字符内)、单声道转换、标准目录结构(cpu/br23/tools/)及使用user_tone_g.bat脚本生成res.bin资源文件。程序配置需修改:1)启用NOR_FS文件系统;2)调整存储空间;3)配置外置Flash参数;4)增强下载脚本追加资源参数。测试阶段建议替换开机提示音验证功能,扩展开发可参考tone_player.c的索引播放逻辑。所有操作均配有图示说明,关键配置需修改对应头文件和脚本参数。

qq_42014563的博客 587

AI故障预测系统架构设计:5个核心模块+3种主流架构,收藏这篇就够了

深夜11点,某汽车工厂的生产线突然停机——核心机器人的轴承磨损过度导致卡壳。维修人员连夜抢修,直接损失超过50万元,还延误了客户的交货期。传统的“事后维修”或“定期维护”要么代价高昂,要么防不胜防。AI故障预测系统的出现,让“精准维护”成为可能——它能通过传感器数据提前7-30天预警故障,将停机损失降低80%以上。知道要做故障预测,却不知道怎么搭系统——数据怎么采集?特征怎么提取?模型怎么部署?架构怎么选?本文将解决这些问题:我们会拆解AI故障预测系统的5个核心模块,分析3种主流架构。

AIGC应用创新大全的博客 1019

通过JNI调用C语言函数实现与linux上其他进程进行通信的共享内存和消息队列

JDBC实践前言一、创建容器数据库1.容器数据库的创建2.创建数据库二、连接容器数据库1.Druid数据库连接池2.JDBCTemplate三、批量插入数据1.单条插入2.批量插入13.批量插入2三、查询数据库表项总结前言一、创建容器数据库1.容器数据库的创建2.创建数据库二、连接容器数据库1.Druid数据库连接池2.JDBCTemplate三、批量插入数据1.单条插入2.批量插入13.批量插入2三、查询数据库表项总结前言一、创建容器数据库1.容器数据库的创建总结 前言 记录自己初次学完数据库后的简单项

weixin_43409772的博客 648

【人工智能】RAG如何根据实际需求选择和进行文档解析(如 PDF、Word、TXT、网页等)?

文档解析的核心在于根据解析目标、文档类型和处理量选择合适工具。PDF、Word、TXT和网页各有特性:PDF需区分可编辑与扫描版,Word需处理结构化内容,TXT简单但需注意编码,网页需应对动态内容。解析场景包括提取纯文本、结构化数据、保留格式和批量处理。非技术用户可借助工具如Adobe Acrobat、WPS和在线OCR,技术用户可通过编程实现自动化。通用流程为:明确目标、分析文档属性、选择工具并测试优化。核心是“工具适配需求”,无需追求万能方案。

奶爸的编程之路,也就一周冷个三天 506

C Linux系统编程:进程通讯完全指南,管道通讯、共享内存以及消息队列

进程间通信 (Inter-Process Communication, IPC)是指在不同进程之间传播或交换信息的一系列技术和方法。每个进程都拥有自己独立的虚拟地址空间,一个进程无法直接访问另一个进程的数据或者进行通讯,为了实现协同工作,操作系统必须提供专门的机制来促成这种通信,这就是IPC的意义所在。管道 (Pipe)命名管道 (FIFO)信号 (Signal)消息队列 (Message Queue)共享内存 (Shared Memory)信号量 (Semaphore)

buyutang_的博客 1241

RK3588网卡出现丢包或者带宽不足的问题验证排查

注意除了有最大的TCP数据接收缓冲,还有/proc/sys/net/core/wmem_max — 最大的TCP数据发送缓冲可以调整,这里暂时没用到,针对具体需要可适当调整。比如把ethx接口中断从默认的cpu0迁移到其它cpu,例如将eth0中断234移到cpu7 (10是16进制, cpu0 =3588的cpu有8个核,4个A55(小核)+4个A76(大核),可以找到对应中断 将中断从默认cpu0核切到cpu7。tcp_rmem:单位是字节,接收缓存区大小,缓存从对端接收的数据,后续会被应用程序读取。

Android/Linux驱动开发传帮带学习,让驱动入门门槛更低! 2028

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

告别管道和共享内存:用Linux消息队列(msgget/msgsnd/msgrcv)重构你的C语言多进程通信

本文探讨了如何利用Linux消息队列(msgget/msgsnd/msgrcv)重构C语言多进程通信,替代传统的管道和共享内存方案。通过详细解析消息队列的核心API、实战重构示例及生产环境优化技巧,帮助开发者实现更高效、解耦的进程间通信,特别适合需要异步处理和优先级消息的场景。

weixin_30607659的博客 378

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Linux c 基于内存的进程通信—共享内存、共享队列(消息队列)

基于内存的进程通信: 1.      内核共享内存 编程模型:     1.1.创建共享内存,得到一个ID  shmget 1.2.把ID影射成虚拟地址(挂载)  shmat        1.3.使用虚拟地址访问内核共享内存使用任何内存函数与运算符号                        1.4.卸载虚拟地址 shmdt        1.5.删除共享内存 shctl(修改/

Y_23k_bug的专栏 4236

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

linux c编程 消息队列,信号量,共享内存--简单IPC通信例子--复制黏贴就可以快速使用

复制黏贴就可以快速使用。 消息通信 msgreceive.c #include <unistd.h> #include <stdlib.h> #include <stdio.h> #include <string.h> #include <errno.h> #include <sys/msg.h> struct msg_s...

爱敲代码的硬币博客 334

【C语言】消息队列

C-queue读取消息队列代码消息队列 写 代码 读取消息队列代码 #include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h> #include <stdio.h> //int msgget(key_t key, int msgflg); //ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, //

afleshfish的博客 4561
下一篇: 编辑器ed介绍
ToBe_NotToBe
博客等级 码龄15年 0粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值