linux 共享内存 sys-V函数类型

简介: linux 共享内存 sys-V函数类型

微信图片_20230117212305.png


shmdata.h头文件:

#ifndef _SHMDATA_H_HEADER
#define _SHMDATA_H_HEADER
#define TEXT_SZ 2048
struct shared_use_st
{
            int written;//作为一个标志,非0:表示可读,0表示可写 
            char text[TEXT_SZ];//记录写入和读取的文本
};
#endif

共享内存写端 shmwrite.c

include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/shm.h>
#include "shmdata.h"
int main()
{
        int running = 1;
        void *shm = NULL;
        struct shared_use_st *shared = NULL;
        char buffer[BUFSIZ + 1];//用于保存输入的文本
        int shmid;  //创建共享内存
        shmid = shmget((key_t)1234, sizeof(struct shared_use_st), 0666|IPC_CREAT);
        if(shmid == -1)
        {
                fprintf(stderr, "shmget failed\n");
                exit(EXIT_FAILURE);
        }   //将共享内存连接到当前进程的地址空间
        shm = shmat(shmid, (void*)0, 0);
        if(shm == (void*)-1)
        {
                fprintf(stderr, "shmat failed\n");
                exit(EXIT_FAILURE);
        }
        printf("Memory attached at %p\n", shm);    //设置共享内存   
        shared = (struct shared_use_st*)shm;
        while(running)//向共享内存中写数据  
        {       //数据还没有被读取,则等待数据被读取,不能向共享内存中写入文本       
                while(shared->written == 1)
                {
                        //sleep(1);      
                        //printf("Waiting...\n");
                }       //向共享内存中写入数据       
                printf("Enter some text: ");
                fgets(buffer, BUFSIZ, stdin);
                strncpy(shared->text, buffer, TEXT_SZ); //输入了end,退出循环(程序)       
                shared->written = 1;     // 
                if(strncmp(buffer, "end", 3) == 0)
                        running = 0;
        }   
        if(shmdt(shm) == -1) //把共享内存从当前进程中分离
        {
                fprintf(stderr, "shmdt failed\n");
                exit(EXIT_FAILURE);
        }
        sleep(2);
        exit(EXIT_SUCCESS);
}

共享内存读端 shmread.c

#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/shm.h>
#include "shmdata.h"
int main()
{
        int running = 1;//程序是否继续运行的标志  
        void *shm = NULL;//分配的共享内存的原始首地址   
        struct shared_use_st *shared;//指向shm   
        int shmid;//共享内存标识符 //创建共享内存   
        shmid = shmget((key_t)1234, sizeof(struct shared_use_st), 0666|IPC_CREAT);
        if(shmid == -1)
        {
                fprintf(stderr, "shmget failed\n");
                exit(EXIT_FAILURE);
        }   //将共享内存连接到当前进程的地址空间
        shm = shmat(shmid, 0, 0);
        if(shm == (void*)-1)
        {
                fprintf(stderr, "shmat failed\n");
                exit(EXIT_FAILURE);
        }
        printf("\nMemory attached at %p\n", shm);  //设置共享内存   
        shared = (struct shared_use_st*)shm;
        shared->written = 0;
        while(running)//读取共享内存中的数据 
        {       //没有进程向共享内存定数据有数据可读取       
                if(shared->written != 0)
                {
                        printf("You wrote: %s", shared->text);
                        sleep(rand() % 3);          //读取完数据,设置written使共享内存段可写
                        shared->written = 0;         //输入了end,退出循环(程序)  
                        if(strncmp(shared->text, "end", 3) == 0)
                                running = 0;
                }
                else//有其他进程在写数据,不能读取数据     
                        sleep(1);
        }   //把共享内存从当前进程中分离
        if(shmdt(shm) == -1)
        {
                fprintf(stderr, "shmdt failed\n");
                exit(EXIT_FAILURE);
        }   //删除共享内存   
       /* if(shmctl(shmid, IPC_RMID, 0) == -1)
        {
                fprintf(stderr, "shmctl(IPC_RMID) failed\n");
                exit(EXIT_FAILURE);
        }*/
        exit(EXIT_SUCCESS);
}

微信图片_20230117212525.png微信图片_20230117212528.png


微信图片_20230117212603.png

目录
相关文章
|
29天前
|
C语言 C++
C语言 之 内存函数
C语言 之 内存函数
32 3
|
5天前
|
算法 Linux 开发者
深入探究Linux内核中的内存管理机制
本文旨在对Linux操作系统的内存管理机制进行深入分析,探讨其如何通过高效的内存分配和回收策略来优化系统性能。文章将详细介绍Linux内核中内存管理的关键技术点,包括物理内存与虚拟内存的映射、页面置换算法、以及内存碎片的处理方法等。通过对这些技术点的解析,本文旨在为读者提供一个清晰的Linux内存管理框架,帮助理解其在现代计算环境中的重要性和应用。
|
9天前
|
Ubuntu Linux Shell
Linux 系统中的代码类型或脚本类型内容
在 Linux 系统中,代码类型多样,包括 Shell 脚本、配置文件、网络配置、命令行工具和 Cron 定时任务。这些代码类型广泛应用于系统管理、自动化操作、网络配置和定期任务,掌握它们能显著提高系统管理和开发的效率。
|
10天前
|
存储 缓存 监控
|
21天前
|
程序员 C++ 容器
在 C++中,realloc 函数返回 NULL 时,需要手动释放原来的内存吗?
在 C++ 中,当 realloc 函数返回 NULL 时,表示内存重新分配失败,但原内存块仍然有效,因此需要手动释放原来的内存,以避免内存泄漏。
|
30天前
|
存储 缓存 监控
Linux中内存和性能问题
【10月更文挑战第5天】
37 4
|
29天前
|
算法 Linux
Linux中内存问题
【10月更文挑战第6天】
39 2
|
8天前
|
缓存 算法 Linux
Linux内核中的内存管理机制深度剖析####
【10月更文挑战第28天】 本文深入探讨了Linux操作系统的心脏——内核,聚焦其内存管理机制的奥秘。不同于传统摘要的概述方式,本文将以一次虚拟的内存分配请求为引子,逐步揭开Linux如何高效、安全地管理着从微小嵌入式设备到庞大数据中心数以千计程序的内存需求。通过这段旅程,读者将直观感受到Linux内存管理的精妙设计与强大能力,以及它是如何在复杂多变的环境中保持系统稳定与性能优化的。 ####
16 0
|
30天前
|
存储 缓存 固态存储
|
1月前
|
存储 程序员 编译器
C语言——动态内存管理与内存操作函数
C语言——动态内存管理与内存操作函数
下一篇
无影云桌面