sys V 进程间通信之共享内存

news2024/12/28 10:58:07

note

1.使用shmget将在内核创建一个共享内存区

2.使用shmctl才可以删除内核创建的共享内存区

3.使用shmat给当前进程开辟与内核共享内存对应的内存区p,用户态对p的操作会作用到内核共享内存区

code

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <unistd.h>
#include <errno.h>
#include <sys/mman.h>
#include <time.h>
#include <sys/wait.h>

int shm_id = -1;    // 共享内存实例(内核实例),由父进程管理
const size_t shm_len = 1024;    // 共享内存字节数
struct mm { // 父子进程通信数据协议
    int flag;   /* 父进程写状态111 or 子进程读状态222*/
    char data[1020];
};

static void remove_shm(void) {
    int ret = -1;
    
    if (shm_id != -1) {
        fprintf(stdout, "now remove by shm_id\n");
        ret = shmctl(shm_id, IPC_RMID, NULL);
        if (ret == -1) {
            fprintf(stderr, "shmctl error,%s\n", strerror(errno));
        }
        shm_id = -1;
    }
}

int main(int argc, char** argv) {
    key_t key = 0;
    pid_t pid = 0;
    char *pathname = argv[0];
    int proj_id = 0x11; // 盐值
    struct mm* shm = NULL;

    key = ftok(pathname, proj_id); // key由当前程序名和盐值生成
    if (key == -1) {
        fprintf(stderr, "ftok error,%s\n", strerror(errno));
        exit(EXIT_FAILURE);
    }

    shm_id = shmget(key, shm_len, IPC_CREAT|666);
    if (shm_id == -1) {
        fprintf(stderr, "shmget error,%s\n", strerror(errno));
        exit(EXIT_FAILURE);
    }

    // 把共享内存映射到当前父进程空间
    shm = shmat(shm_id, NULL, 0); // 0:可读可写
    if (shm == (void*)(-1)) {
        fprintf(stderr, "shmat error,%s\n", strerror(errno));
        remove_shm();
        exit(EXIT_FAILURE);
    }
    shm->flag = 111;    //父进程先初始化共享内存读写标志

    pid = fork();
    if (pid < 0) {
        fprintf(stderr, "fork error,%s\n", strerror(errno));
        shmdt(shm); // 父进程解除共享内存映射
        remove_shm();   // 父进程销毁共享内存(内核实例)
        exit(EXIT_FAILURE);
    }

    if (pid == 0) { // 子进程
        int i = 0;
        shm = shmat(shm_id, NULL, 0);   // 把共享内存映射到当前子进程空间
        if (shm == (void*)(-1)) {
            fprintf(stderr, "fork error,%s\n", strerror(errno));
            exit(EXIT_FAILURE);
        }
        for (i = 0; i < 10; i++) {
            if (shm->flag == 222) {
                fprintf(stdout, "shm.data:%s", shm->data);
                shm->flag = 111;
            }
            sleep(1);
        }
        shmdt(shm); // 子进程解除共享内存映射
        exit(EXIT_SUCCESS);
    }
    else if (pid > 0) { // 父进程
        int i = 0;
        for (i = 0; i < 10; i++) {
            if (shm->flag == 111) {
                memset(shm->data, 0, shm_len);
                time_t t;
                time(&t);
                sprintf(shm->data, "parent writed to shm,time is %s", ctime(&t));
                shm->flag = 222;
            }
            sleep(1);
        }
        wait(NULL); // 父进程等待子进程资源回收完成
        shmdt(shm); // 父进程解除共享内存映射
        remove_shm();   // 父进程删除共享内存实例(内核实例)
        exit(EXIT_SUCCESS);
    }

    return 0;
}

test

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/745650.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ROS:Rviz中控制机器人模型运动

目录 一、Arbotix简介二、安装 Arbotix二、Arbotix使用案例2.1需求2.2流程2.2.1创建新功能包&#xff0c;准备机器人 urdf、xacro 文件2.2.2添加 Arbotix 配置文件2.2.3编写 launch 文件配置 Arbotix2.2.4启动 launch 文件并控制机器人模型运动 一、Arbotix简介 Arbotix 是一款…

Python 标签(便签贴)打印,直接连接打印机打印

前言&#xff1a;一开始试了好多打印方式&#xff0c;图片打印很糊&#xff0c;docx文件打印效果最好&#xff0c;但是每次打印会打开Word 影响效率&#xff0c;PDF也会打开PDF软件&#xff0c;打印效果略差于docx文件&#xff0c;TXT文件又不能设置字体&#xff0c;找了好久&a…

8 Surprising Things You Can Do With ChatGPT 你可以用 ChatGPT 做的 8 件令人惊讶的事情

If you’ve heard about ChatGPT and think it’s just a fancy chatbot, you might be underestimating the range of what it can do. Here are some surprising things you can do with ChatGPT, whether you want to write a resume or have it dungeon-master an epic rol…

第二章(二):Django框架Model之ORM操作数据库:增、删、改、查

系列文章目录 备注&#xff1a;这里是Django系列文章的所有文章的目录 第一章(一) : Django框架之创建项目/应用/templates、连接MYSQL、配置日志LOGGING、启动django项目 第一章(二)&#xff1a;Django框架的模式、路由、视图&#xff1b; 第一章(三)&#xff1a;Django框架的…

Linux14.文件(下)

文件描述符fd&#xff0c;分配到的是从0开始最小的没有被占用的。 2.输出重定向(重定向的本质&#xff0c;就是在操作系统内部更改fd对应的内容的指向)&#xff0c;同时理解输入重定向和追加重定向。 3.重定向函数dup2(oldfd, newfd)&#xff0c;oldfd -> newfd (小技巧:一…

jennkins配置k8s动态slave

一、 首先完成jenkins的部署可参考jenkins部署 二、 如果是在同一个k8s集群下部署的则直接这样配置 在security中agent的端口也配置成50000 如果是虚拟机中部署的jenkins添加k8s需要做如下操作 echo ‘certificate-authority-data-value’ | base64 -d > ./ca.crt &#…

数字化转型中,企业如何做系统设计

随着人工智能、大数据、云计算、区块链等新一代信息化、数字化技术的高速发展&#xff0c;现阶段社会的方方面面都已经有了巨大的改变&#xff0c;各行各业的企业也都开始了新一轮的科技革命和产业革命&#xff0c;可以说是互联网时代之后&#xff0c;又一个能够从各方面影响世…

MySQL物理文件----日志文件(错误日志、通用查询日志、二进制日志、慢查询日志)

文章目录 MYSQL5.7/8.0支持的几种日志文件1、错误日志&#xff08;Error log&#xff09;2、一般或通用查询日志&#xff08;General query log&#xff09;3、二进制日志&#xff08;Binary log&#xff09;3、1 查看是否开启二进制日志3、2二进制日志开启3、3查看二进制文件位…

数据结构05:树与二叉树[C++][并查集]

图源&#xff1a;文心一言 Chat GPT生成&#xff0c;代码的核心思想与王道咸鱼老师的视频虽然类似&#xff0c;但是在具体实现上毕竟还是略有差别~~因此&#xff0c;如果对考研方向的并查集代码感兴趣&#xff0c;可以查看—— 王道咸鱼老师的视频&#xff1a;{5.5_2_并查集_…

会议邀请|思腾合力邀您共赴MICS 2023第十届医学图像计算青年研讨会

医学图像计算青年研讨会 (Medical Imaging Computing Seminar, MICS) 于2014年成立&#xff0c;宗旨是为医学影像分析领域的全球华人学者提供学术交流平台&#xff0c;增进本领域科研人员和医学专家的交流和合作。 第十届医学图像计算青年研讨会 (MICS 2023) 将于2023年7月14-1…

form表单禁止浏览器自动填充密码

因为用户修改密码的时候,谷歌浏览器、edge等浏览器,总是自动将保存的密码填充到重置密码输入框中,给用户使用带来困扰。原因是因为你在登录的时候选择记住了账号和密码了,所以就会把信息存在浏览器里面,当你在修改密码的时候,由于form表单的 type="password" 所…

【Arduino小车实践】PID算法简介

一、介绍 1. 特点 流量稳定、改变流量&#xff08;水阀&#xff09;&#xff1a;测量当前流量&#xff0c;与预期流量进行比对&#xff0c;不相等则进行相应的调整。 2. 适用系统 适用线性系统&#xff08;二阶以内的线性系统&#xff09;&#xff1a;齐次性、叠加性 3. 宏…

ASEMI-A7二极管可用什么代替,M7二极管正负极判断

编辑-Z 在电子设备的世界中&#xff0c;二极管是最常见的组件之一。它们在各种设备中发挥着重要的作用&#xff0c;包括电源适配器、电源供应器、电池充电器等。在这篇文章中&#xff0c;我们将探讨A7二极管可用什么代替&#xff0c;以及M7二极管正负极判断。 首先&#xff0c…

解决Vue 报错error:0308010C:digital envelope routines::unsupported问题

解决Vue 报错error:0308010C:digital envelope routines::unsupported问题 问题原因方法一&#xff1a;修改配置方法二&#xff1a;尝试卸载Node.js 17版本并重新安装Node.js 16版本&#xff0c;然后再重新启动方法三&#xff1a;package.json增加配置&#xff08;大多数解决问…

【自动驾驶汽车量子群粒子过滤器】用于无人驾驶汽车列车定位的量子粒子滤波研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

Doris单机安装部署

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、前期准备1.下载安装包2.修改limits文件 二、安装1.配置启动FE2.配置启动BE3.web测试4.连接测试、添加BE 结尾 前言 Apache Doris 是一个基于 MPP 架构的高…

Linux搭建PXE服务器

安装PXE启动服务器所需的软件包 Tftp&#xff0c;dhcp和vsftpd&#xff08;httpd也可以作为安装源&#xff09; 编辑TFTP配置文件 重启tftp服务 编辑/etc/dhcp/dhcpd.conf,新建作用域&#xff0c;主要设置下一跳服务器地址和引导文件名称。 重启dhcp服务 把centos光盘内容拷贝…

营销本地化,跨境电商都要懂的行业知识

营销本地化是调整营销内容以满足目标市场的文化、语言和其他相关差异的过程&#xff0c;这对于那些希望在全球市场取得成功的企业至关重要。它可以帮助公司与客户建立有意义的联系&#xff0c;并提供优质的客户体验。随着技术和互联网的进步&#xff0c;企业可以获得大量资源、…

基于单片机的厨房安全监测系统的设计与实现

功能介绍 以STM32/51单片机作为主控系统&#xff1b; OLED液晶显示当前检测的气体浓度&#xff0c;温度&#xff0c;是否有火等信息&#xff1b; 按键可以设置温度上限、可燃气体浓度上限&#xff1b; 当温度超过我们设置自动开启风扇进行降温&#xff1b; 当检测到天然气泄露后…

【误差自适应跟踪方法AUV】自适应跟踪(EAT)方法研究(Matlab代码Simulin实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…