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

目录
相关文章
|
2月前
|
C语言 C++
C语言 之 内存函数
C语言 之 内存函数
37 3
|
21天前
|
缓存 Java Linux
如何解决 Linux 系统中内存使用量耗尽的问题?
如何解决 Linux 系统中内存使用量耗尽的问题?
105 48
|
9天前
|
存储 缓存 算法
【C语言】内存管理函数详细讲解
在C语言编程中,内存管理是至关重要的。动态内存分配函数允许程序在运行时请求和释放内存,这对于处理不确定大小的数据结构至关重要。以下是C语言内存管理函数的详细讲解,包括每个函数的功能、标准格式、示例代码、代码解释及其输出。
36 6
|
21天前
|
缓存 Linux
如何检查 Linux 内存使用量是否耗尽?
何检查 Linux 内存使用量是否耗尽?
|
1月前
|
算法 Linux 开发者
深入探究Linux内核中的内存管理机制
本文旨在对Linux操作系统的内存管理机制进行深入分析,探讨其如何通过高效的内存分配和回收策略来优化系统性能。文章将详细介绍Linux内核中内存管理的关键技术点,包括物理内存与虚拟内存的映射、页面置换算法、以及内存碎片的处理方法等。通过对这些技术点的解析,本文旨在为读者提供一个清晰的Linux内存管理框架,帮助理解其在现代计算环境中的重要性和应用。
|
1月前
|
Ubuntu Linux Shell
Linux 系统中的代码类型或脚本类型内容
在 Linux 系统中,代码类型多样,包括 Shell 脚本、配置文件、网络配置、命令行工具和 Cron 定时任务。这些代码类型广泛应用于系统管理、自动化操作、网络配置和定期任务,掌握它们能显著提高系统管理和开发的效率。
|
13天前
|
存储 算法 安全
深入理解Linux内核的内存管理机制
本文旨在深入探讨Linux操作系统内核的内存管理机制,包括其设计理念、实现方式以及优化策略。通过详细分析Linux内核如何处理物理内存和虚拟内存,揭示了其在高效利用系统资源方面的卓越性能。文章还讨论了内存管理中的关键概念如分页、交换空间和内存映射等,并解释了这些机制如何协同工作以提供稳定可靠的内存服务。此外,本文也探讨了最新的Linux版本中引入的一些内存管理改进,以及它们对系统性能的影响。
|
1月前
|
存储 缓存 监控
|
2月前
|
程序员 C++ 容器
在 C++中,realloc 函数返回 NULL 时,需要手动释放原来的内存吗?
在 C++ 中,当 realloc 函数返回 NULL 时,表示内存重新分配失败,但原内存块仍然有效,因此需要手动释放原来的内存,以避免内存泄漏。
|
2月前
|
存储 缓存 监控
Linux中内存和性能问题
【10月更文挑战第5天】
40 4