首页 > 系统相关 >进程间通信方式-共享内存

进程间通信方式-共享内存

时间:2024-07-06 14:01:58浏览次数:18  
标签:IPC 映射 int 间通信 shmid key 进程 共享内存

目录

1.特点

2.使用步骤

3.函数接口

3.1创建key值

3.2创建或打开共享内存

3.3映射共享内存

3.4取消映射

3.5删除共享内存

4.命令

5.基本操作


1.特点

(1)共享内存是一种最为高效的进程间通信方式,进程可以直接读写内存,而不需要任何数据的拷贝。

(2)为了在多个进程间交换信息,内核专门留出了一块内存区,可以由需要访问的进程将其映射到自己的私有地址空间。进程就可以直接读写这一内存区而不需要进行数据的拷贝,从而大大提高的效率。

(3) 由于多个进程共享一段内存,因此也需要依靠某种同步机制,如互斥锁和信号量等

2.使用步骤

(1) 创建 key值

(2) 创建或打开共享内存

(3) 映射共享内存到用户空间

(4) 撤销映射

(5) 删除共享内存

3.函数接口

3.1创建key值

key_t ftok( constchar *pathname, int proj_id);

功能:创建出来的具有唯一映射关系的一个key值,帮助操作系统用来标识一块共享内存

参数:Pathname:已经存在的可访问文件的名字

                Proj_id:一个字符(因为只用低8位)

返回值:成功:key值

                失败:-1

// 将文件的索引节点号取出ls -i,前面加上proj_id得到key_t的返回值。如指定文件的索引节点号为65538,换算成16进制为 0x010002取后4位,而你指定的ID值为38,换算成16进制为0x26,则最后的key_t返回值为0x26010002。中间的01是系统编号。

3.2创建或打开共享内存

int shmget( key_t key, size_t size, int shmflg);

功能:创建或打开共享内存

参数:

        key 键值

        size 共享内存的大小

        shmflg IPC_CREAT | IPC_EXCL | 0777

返回值:成功 shmid

                出错 -1

//当IPC_CREAT | IPC_EXCL时, 如果没有该块共享内存,则创建,并返回共享内存ID。若已有该块共享内存,则返回-1。

3.3映射共享内存

void *shmat( int shmid, constvoid *shmaddr, int shmflg); //attaches

功能:映射共享内存,即把指定的共享内存映射到进程的地址空间用于访问

参数:

                shmid 共享内存的id号

                shmaddr 一般为NULL,表示由系统自动完成映射

                                如果不为NULL,那么有用户指定

                shmflg:SHM_RDONLY就是对该共享内存只进行读操作

                             0 可读可写

返回值:成功:完成映射后的地址,

                出错:-1(地址)

用返回值判断用法:if((p =(char*)shmat(shmid,NULL,0))==(char*)-1)

3.4取消映射

int shmdt( constvoid *shmaddr); //detaches

功能:取消映射

参数:要取消的地址

返回值:成功 0

        失败的 -1

3.5删除共享内存

int shmctl( int shmid, int cmd, struct shmid_ds *buf); //control

功能:(删除共享内存),对共享内存进行各种操作

参数:

        shmid 共享内存的id号

        cmd IPC_STAT 获得shmid属性信息,存放在第三参数

                IPC_SET 设置shmid属性信息,要设置的属性放在第三参数

                IPC_RMID 删除共享内存,此时第三个参数为NULL即可

        buf shmid 所指向的共享内存的地址,空间被释放以后地址就赋值为null

返回:成功0

        失败-1

用法: shmctl( shmid, IPC_RMID, NULL);

4.命令

ipcs -m: 查看系统中的共享内存

ipcrm -m shmid:删除共享内存

ps: 可能不能直接删除掉还存在进程使用的共享内存。

这时候可以用 ps -ef对进程进行查看,kill 掉多余的进程后,再使用 ipcs查看。

5.基本操作

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

int main(int argc, char const *argv[])
{

    // 创建key值
    key_t key;
    key = ftok("shm.c", 'd');
    if (key < 0)
    {
        perror("key error");
        return -1;
    }
    printf("key:%#x\n", key);

    // 创建或打开共享内存
    // 不存在创建,存在返回-1
    int shmid;
    shmid = shmget(key, 128, IPC_CREAT | IPC_EXCL | 0777);

    if (shmid <= 0)
    {

        if (errno == EEXIST) // 如果存在,直接打开,返回id
        {
            shmid = shmget(key, 128, 0777);
        }
        else
        {
            perror("shmid error");
            return -1;
        }
    }
    printf("shmid:%d\n", shmid);

    // 映射共享内存
    char *p;
    p = (char *)shmat(shmid, NULL, 0);
    if (p == (char *)-1)
    {
        perror("shmat err");
        return -1;
    }

    // 操作共享内存
    scanf("%s", p);
    // printf("%s \n", p);

    // 取消映射
    shmdt(p);

    // 删除共享内存
    shmctl(shmid, IPC_RMID, NULL);

    return 0;
}

标签:IPC,映射,int,间通信,shmid,key,进程,共享内存
From: https://blog.csdn.net/weixin_67273669/article/details/140225842

相关文章

  • Linux中的共享内存
    我们承担ROS,FastDDS等中间件以及C++,cmake等技术的项目开发和专业指导和培训,有10年+工作经验,质量有保证,如有需要请私信联系。Linux共享内存是一种进程间通信的方式,让不同的进程可以访问同一块内存区域。这样,一个进程可以直接读取或者修改另一进程的数据,避免了数据的复制,提高了......
  • 进程、程序、应用程序之间的关系
    文章目录进程和程序进程和应用程序总结参考资料进程和程序程序:程序是存放在硬盘中的可执行文件,主要包括代码指令和数据。程序本身是一个静态的文件,只有在被操作系统加载到内存中并执行时才会变成进程。进程:进程是程序在操作系统中的执行实例。一个进程是一个程序......
  • 线程和进程
    1.什么是线程?什么是进程?正在运行的程序称之为进程。进程它是系统分配资源的基本单位。线程,又称轻量级进程(LightWeightProcess)。线程是进程中的一条执行路径,也是CPU的基本调度单位。若一个程序可同一时间执行多个线程,就是支持多线程的.一个进程由一个或多个线程组成,彼此......
  • GPT-4o不仅能写代码,还能自查Bug,程序员替代进程再进一步!
    目录1 CriticGPT01综合性(Comprehensiveness):02幻觉问题(Hallucinatesaproblem):2其他CriticGPT案例随着人工智能(AI)技术不断进步,AI在编程领域的应用取得了显著的成果。通过使用自然语言处理(NLP)和机器学习(ML)技术,AI可以自动生成代码、检测错误并优化性能。一个例......
  • python多线程与多进程开发实践及填坑记(1)
    1.需求分析1.1.概述基于Flask、Pika、Multiprocessing、Thread搭建一个架构,完成多线程、多进程工作。具体需求如下:并行计算任务:使用multiprocessing模块实现并行计算任务,提高计算效率、计算能力。消息侦听任务:使用threading模块完成RabbitMQ消息队列的侦听任务,将接收到......
  • Linux进程间的通信方式(三)System V 信号量
    文章目录前言一、信号量概念1.1信号跟信号量的区别1.2同步跟互斥的区别1.2.1同步的概念1.2.2互斥的概念1.3原子操作概念二、信号量的相关操作函数2.1ftok函数(获取一个key值)2.2semget函数(创建或者获取信号量)2.3semctl函数(控制信号量)2.4semop函数(操作信号......
  • python爬虫3-多进程多线程协程
    多进程和多线程frommultiprocessingimportProcessimportthreadingdefprocess_worker():foriinrange(200):print(f"Processworker{i}")defthread_worker():foriinrange(200):print(f"Threadworker{i}")if__......
  • IO进程间通信-无名管道、有名管道
    1.无名管道1.1特点(1)只能用于具有亲缘关系的进程之间的通信(2)半双工的通信模式,具有固定的读端fd[0]和写端fd[1].(3)管道可以看成是一种特殊的文件,对于他的读写可以使用文件IO,如read,write。(4)管道是基于文件描述符的通信方式。当一个管道建立时,他会创建两个描述符fd[0],fd[1],......
  • Python教程:os.popen(cmd).read()查看后台进程并杀进程
    一、os.popen()方法1.使用语法os.popen()方法用于从一个命令打开一个管道。os.popen(cmd).read()获取执行后结果。os.popen(command[,mode[,bufsize]])#使用的命令#模式权限:默认'r'或者'w'#文件需要的缓冲大小0无缓冲1行缓冲其他数值以字节为单位负值使用系统......
  • Windows bat批处理文件结束某个程序进程,删除文件夹
    Windowsbat批处理文件结束某个程序进程,删除文件夹bat文件内容:@echooffsetlocal::要结束的应用程序进程名set"PROCESS_NAME=助手.exe"::使用tasklist和findstr检查进程是否存在tasklist|findstr/I/C:"%PROCESS_NAME%">nulif%ERRORLEVEL%eq......