Linux 进程间通讯共享内存方式

共享内存方式:从物理内存里面拿出来一部分作为多个进程共享。

共享内存是进程间共享数据的一种最快的方法,一个进程向共享内存区域写入数据,共享这个内存的所有进程都可以立即看到其中内容。

共享内存实现步骤:

一、创建共享内存,使用shmget函数。

二、映射共享内存,将这段创建的共享内存映射到具体的进程空间去,使用shmat函数。

创建共享内存shmget:

intshmget(key_t key, size_t size, int shmflg)

功能:得到一个共享内存标识符或创建一个共享内存对象并返回共享内存标识符。

key: 0(IPC_PRIVATE)会建立共享内存对象

size:大于0的整数,新建共享内存的大小,以字节为单位。只获取共享内存时,指定为0.

shmflg:

0表示取共享内存标识符,如不存在则函数会报错;

IPC_CREAT,如果内核中不存在键值与key相等的共享内存时,则创建一个共享内存;如果存在这样的共享内存则返回共享内存的标识符;

IPC_CREAT|IPC_EXCL: 如果内核中不存在键值与key相等的共享内存,则新建一个消息队列;如果存在这样的共享内存则报错;

函数返回值:成功则返回内存的标识符;出错则返回-1,错误原因存在于error中

映射共享内存到调用进程的地址空间shmat:

void*shmat(int shmid, const void *shmaddr, int shmflg)

msqid:共享内存标识符

shmaddr:指定共享内存出现在进程内存地址的什么位置,直接指定为NULL让内核自己决定一个合适的地址位置。

shmflg: SHM_RDONLY 只读模式,其他为读写模式

函数返回值:成功则返回附加好的共享内存地址;出错返回-1,错误原因存在于error中

断开共享内存连接shmdt:

intshmdt(const void *shmaddr)

功能:传入shmaddr,连接共享的内存起始地址;断开成功则返回0,出错则返回-1,错误原因存在于error中。

父子进程间通讯实例:

#include

#include

#include

#include

#include

#include

int main(int argc, char **argv){

if(argc< 2){ //需要输入共享的数据

printf("pleaseinput the shared data.n");

exit(-1);

}

intshmid;

shmid= shmget(0,1024,IPC_CREAT);

if(shmid== -1){ // 申请共享内存失败

printf("createshare memory failed.n");

exit(-1);

}

if(fork()){ // 父进程之中

char*p_shmaddr;

p_shmaddr= shmat(shmid, NULL, 0); // 映射到父进程之中的一个地址

memset(p_shmaddr,0, 1024); // 初始化共享内存

strcpy(p_shmaddr,argv[1]); // 拷贝共享数据到共享内存

wait(NULL); //等待子进程结束

exit(0);

}

else{

sleep(2); //等待父进程写入数据

char*c_shmaddr;

c_shmaddr= shmat(shmid,NULL,0); // 映射到子进程之中一个地址,具体由kernel 指配

printf("theshare data is: %sn", c_shmaddr); //子进程输出共享的数据

exit(0);

}

}

(0)

相关推荐

  • Electron进程间通讯【一】主进程与渲染进程通信

    Electron进程间通讯通信有3种情况:主进程与渲染进程之间的通讯.主进程与主进程之间的通讯.渲染进程与渲染进程之间的通讯. 本教程讲解Electron进程间通讯的第1种情况--主进程与渲染进程之间 ...

  • Linux进程通信(IPC)方式简介

    linux下进程间通信的几种主要方式:管道(pipe)和有名管道(FIFO)、信号(signal)、消息队列、共享内存(shared memory)、信号量(semaphore)、套接字(socket ...

  • 查看LINUX进程内存占用情况

    (1)top top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器 可以直接使用top命令后,查看%MEM的内容。可以选择按进程查看或 ...

  • CentOS下共享内存使用的常见陷阱详解

    所谓共享内存就是使得多个进程可以访问同一块内存空间,是最快的可用IPC形式.是针对其他通信机制运行效率较低而设计的.往往与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥.其他进程能把同一段共 ...

  • Linux用户进程是如何释放内存的

    Linux用户进程是如何释放内存的 Linux进程使用内存的基本流程: 从图中我们可以看出,进程的堆,并不是直接建立在Linux的内核的内存分配策略上的,而是建立在glibc的堆管理策略上的(也就是g ...

  • Linux进程和线程的基础与管理

    一.进程的基本概念 程序是为了完成某种任务而设计的软件,比如vi是程序。什么是进程呢? 进程就是运行中的程序。一个运行着程序,可能有多个进程。比如Web服务器是Apache服务器,当管理员启动服务后, ...

  • windows下利用文件映射实现共享内存

    windows下利用文件映射实现共享内存的办法比较简单,下面是实现代码,细节用注释说明. 调用类似linux下shm的操作.该类没有进行太多的测试,欢迎提出问题和bug~~:) #include &l ...

  • Linux文件读写机制及优化方式详解

    Linux是一个可控性强的,安全高效的操作系统.本文只讨论Linux下文件的读写机制,不涉及不同读取方式如read,fread,cin等的对比,这些读取方式本质上都是调用系统api read,只是做了 ...

  • CentOS下如何查看进程用了多少内存命令Pmap?

    Pmap 提供了进程的内存映射,pmap命令用于显示一个或多个进程的内存状态.其报告进程的地址空间和内存状态信息.Pmap实际上是一个Sun OS上的命令,linux仅支持其有限的功能.但是它还是对查 ...