linux笔记之共享内存

这篇博客探讨了Linux下的IPC(进程间通信),重点是共享内存机制。文章介绍了共享内存的优势,如快速的数据传输,但同时也指出其需要额外的同步机制如信号量。接着,博主展示了创建、获取、摧毁共享内存的代码片段,并提供了相关源码文件(comm.h, comm.c, server.c, client.c)。最后,博客展示了运行结果图。" 131239089,2183335,Python断言:验证等于两个值之一的技巧,"['Python', '开发语言', '编程技巧']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.IPC之共享内存

1.进程间通信的三种方法:

  • 消息队列
  • 信号量
  • 共享内存

2.共享内存的优点:
运行时省去了若干次拷贝,是以上三种程序间通信中最快的
3.共享内存的缺点
消息队列 管道等自带同步或互斥机制,而共享内存不自带,故需要使用信号量来实现共享内存的互斥和同步。

二.用代码实现共享内存

1.创建共享内存//int Creat_shm(int size)
创建代码调用的函数
这里写图片描述
以上图片中shmflg的参数若为2的活则有内存则打开,无则创建,若为1和2 的话无则创建有则报错。
2获取代码//int Get_shm()
3.摧毁共享内存//int Destory_shm(int shmid)
摧毁内存调用的函数
这里写图片描述
4.其他函数

  • 关联函数//作用是将页表和物理内存的共享内存关联起来
    这里写图片描述
  • 去关联函数//在页表中释放关联函数关联的地址
    这里写图片描述

三.源代码

1.comm.h

#ifndef _COMM_H_
#define _COMM_H_

#include<errno.h>
#include<sys/ipc.h>
#include<sys/shm.h>
#include<stdio.h>
#include<sys/types.h>

#define PATHNAME "."
#define PROJ_ID 0x6666



int Creat_shm(int size);
int Get_shm();
int Destory_shm(int shmid);



#endif

2.comm.c

#include"comm.h"

int comm_shm(int size,int flags)
{
    int  key=ftok(PATHNAME,PROJ_ID);
    if(key<0)
    {
        perror("ftok");
        return -1;
    }
    int shmid=shmget(key,size,flags);
    if(shmid<0)
    {
        perror("shmid");
        return -2;
    }
    return shmid;

}
int Creat_shm(int size)
{
    return comm_shm(4096,IPC_CREAT|IPC_EXCL|0666);
}
int Get_shm()
{
    return comm_shm(0,IPC_CREAT);
}
int Destory_shm(int shmid)
{
    if(shmctl(shmid,IPC_RMID,NULL)<0)
    {
        perror("shmctl");
        return -1;
    }
}

3.server.c

#include"comm.h"

int main()
{
    int count=0;
    int shmid=Creat_shm(4096);
    sleep(5);
    char* sh_mat=shmat(shmid,NULL,0);
    sleep(5);
    while(count<4096)
    {
        sh_mat[count]='A'+count%26;
        sleep(1);
        count++;
        sh_mat[count]=0;
    }
     shmdt(sh_mat);
     sleep(5);
     Destory_shm(shmid);
    return 0;
}

4.client.c

#include"comm.h"


int main()
{

    int shmid = Get_shm();
    sleep(5);
    char* shm_at=shmat(shmid,NULL,0);
    while(1)
    {
        printf("%s\n",shm_at);
        sleep(1);
    }
    shmdt(shm_at);
    return 0;
}

四.运行结果图

client.c的运行结果
server.c的运行结果
在终端输入ipcs -m可以查看共享内存,输入ipcrm -m shmid会删除对性的共享内存

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值