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

悟途网 2013年06月10日 09:53 阅读()
字号 (A- A+)
共享内存方式:从物理内存里面拿出来一部分作为多个进程共享。
共享内存是进程间共享数据的一种最快的方法,一个进程向共享内存区域写入数据,共享这个内存的所有进程都可以立即看到其中内容。

共享内存实现步骤:
一、创建共享内存,使用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 <stdio.h>
#include <unistd.h>
#include <string.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdlib.h>

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: %s\n", c_shmaddr); //子进程输出共享的数据
exit(0);
}
}

浏览过的人还看过的文章

热门文章
随机推荐
怎么安装和配置Linux系统中的Sendmail服务器

怎么安装和配置Linux系统中

Linux系统中的Sendmail服务器的安装和配置,1.首先安装...

linux根文件系统的制作方法

linux根文件系统的制作方法

linux根文件系统的制作方法:(一):首先linux根文件系...

如何将Linux下的数据库脚本文件从sh格式变为sql格式

如何将Linux下的数据库脚本

Linux下的数据库脚本文件从sh格式变为sql格式,1. sh文件...

实现Linux下安装mysql和curl扩展

实现Linux下安装mysql和curl扩

实现Linux下安装mysql和curl扩展,在安装好apache2+php5之后...

用Linux制作一个简单的共享服务器

用Linux制作一个简单的共享

用Linux制作一个简单的共享服务器,打开一个终端,c...

8个解决linux系统中查看中文乱码问题

8个解决linux系统中查看中文

解决linux系统中查看中文乱码问题,linux系统下的字符集...

在Linux select实现的TCP echo

在Linux select实现的TCP echo

在Linux select实现的TCP echo,每次select前最好都要重新设...

ubuntu linux 文件系统目录结构

ubuntu linux 文件系统目录结构

ubuntu linux 文件系统目录结构,boot/ 启动文件。所有与系...