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

目录
相关文章
|
1月前
|
弹性计算 定位技术 数据中心
阿里云服务器配置选择方法:付费类型、地域及CPU内存配置全解析
阿里云服务器怎么选?2025最新指南:就近选择地域,降低延迟;长期使用选包年包月,短期灵活选按量付费;企业选2核4G5M仅199元/年,个人选2核2G3M低至99元/年,高性价比爆款推荐,轻松上云。
137 11
|
2月前
|
缓存 监控 Linux
Linux内存问题排查命令详解
Linux服务器卡顿?可能是内存问题。掌握free、vmstat、sar三大命令,快速排查内存使用情况。free查看实时内存,vmstat诊断系统整体性能瓶颈,sar实现长期监控,三者结合,高效定位并解决内存问题。
257 0
Linux内存问题排查命令详解
|
4月前
|
安全 C语言
C语言中的字符、字符串及内存操作函数详细讲解
通过这些函数的正确使用,可以有效管理字符串和内存操作,它们是C语言编程中不可或缺的工具。
312 15
|
10月前
|
缓存 Linux
linux 手动释放内存
在 Linux 系统中,内存管理通常自动处理,但业务繁忙时缓存占用过多可能导致内存不足,影响性能。此时可在业务闲时手动释放内存。
510 17
|
6月前
|
缓存 Linux 数据安全/隐私保护
Linux环境下如何通过手动调用drop_caches命令释放内存
总的来说,记录住“drop_caches” 命令并理解其含义,可以让你在日常使用Linux的过程中更加娴熟和自如。
1201 23
|
8月前
|
监控 Linux Python
Linux系统资源管理:多角度查看内存使用情况。
要知道,透过内存管理的窗口,我们可以洞察到Linux系统运行的真实身姿,如同解剖学家透过微观镜,洞察生命的奥秘。记住,不要惧怕那些高深的命令和参数,他们只是你掌握系统"魔法棒"的钥匙,熟练掌握后,你就可以骄傲地说:Linux,我来了!
294 27
|
9月前
|
消息中间件 Linux
Linux中的System V通信标准--共享内存、消息队列以及信号量
希望本文能帮助您更好地理解和应用System V IPC机制,构建高效的Linux应用程序。
382 48
|
9月前
|
存储 Linux
linux中的目录操作函数
本文详细介绍了Linux系统编程中常用的目录操作函数,包括创建目录、删除目录、读取目录内容、遍历目录树以及获取和修改目录属性。这些函数是进行文件系统操作的基础,通过示例代码展示了其具体用法。希望本文能帮助您更好地理解和应用这些目录操作函数,提高系统编程的效率和能力。
351 26
|
9月前
|
缓存 NoSQL Linux
Linux系统内存使用优化技巧
交换空间(Swap)的优化 禁用 Swap sudo swapoff -a 作用:这个命令会禁用系统中所有的 Swap 空间。swapoff 命令用于关闭 Swap 空间,-a 参数表示关闭 /etc/fstab 文件中配置的所有 Swap 空间。 使用场景:在高性能应用场景下,比如数据库服务器或高性能计算服务器,禁用 Swap 可以减少磁盘 I/O,提高系统性能。
377 3
|
9月前
|
缓存 Linux
Linux查看内存命令
1. free free命令是最常用的查看内存使用情况的命令。它显示系统的总内存、已使用内存、空闲内存和交换内存的总量。 free -h • -h 选项:以易读的格式(如GB、MB)显示内存大小。 输出示例: total used free shared buff/cache available Mem: 15Gi 4.7Gi 4.1Gi 288Mi 6.6Gi 9.9Gi Swap: 2.0Gi 0B 2.0Gi • to
733 2
下一篇
oss云网关配置