共享内存应用范例

1、父子进程通信范例 父子进程通信范例,shm.c源代码如下:

#include <stdio.h>

#include <unistd.h>

#include <string.h>

#include <sys/ipc.h>

#include <sys/shm.h>

#include <error.h>

#define SIZE 1024

int main()

{

int shmid ;

char *shmaddr ;

struct shmid_ds buf ;

int flag = 0 ;

int pid ;

shmid = shmget(IPC_PRIVATE, SIZE, IPC_CREAT|0600 ) ;

if ( shmid < 0 )

{

perror("get shm ipc_id error") ;

return -1 ;

}

pid = fork() ;

if ( pid == 0 )

{

shmaddr = (char *)shmat( shmid, NULL, 0 ) ;

if ( (int)shmaddr == -1 )

{

perror("shmat addr error") ;

return -1 ;

}

strcpy( shmaddr, "Hi, I am child process!\n") ;

shmdt( shmaddr ) ;

return 0;

} else if ( pid > 0) {

sleep(3 ) ;

flag = shmctl( shmid, IPC_STAT, &buf) ;

if ( flag == -1 )

{

perror("shmctl shm error") ;

return -1 ;

}

printf("shm_segsz =%d bytes\n", buf.shm_segsz ) ;

printf("parent pid=%d, shm_cpid = %d \n", getpid(), buf.shm_cpid ) ;

printf("chlid pid=%d, shm_lpid = %d \n",pid , buf.shm_lpid ) ;

shmaddr = (char *) shmat(shmid, NULL, 0 ) ;

if ( (int)shmaddr == -1 )

{

perror("shmat addr error") ;

return -1 ;

}

printf("%s", shmaddr) ;

shmdt( shmaddr ) ;

shmctl(shmid, IPC_RMID, NULL) ;

}else{

perror("fork error") ;

shmctl(shmid, IPC_RMID, NULL) ;

}

return 0 ;

}

编译 gcc shm.c –o shm。

执行 ./shm,执行结果如下:

shm_segsz =1024 bytes

shm_cpid = 9503

shm_lpid = 9504

Hi, I am child process!

2、多进程读写范例

多进程读写即一个进程写共享内存,一个或多个进程读共享内存。下面的例子实现的是一个进程写共享内存,一个进程读共享内存。

(1)下面程序实现了创建共享内存,并写入消息。

shmwrite.c源代码如下:

#include <stdio.h>

#include <sys/ipc.h>

#include <sys/shm.h>

#include <sys/types.h>

#include <unistd.h>

#include <string.h>

typedef struct{

char name[8];

int age;

} people;

int main(int argc, char** argv)

{

int shm_id,i;

key_t key;

char temp[8];

people *p_map;

char pathname[30] ;

strcpy(pathname,"/tmp") ;

key = ftok(pathname,0x03);

if(key==-1)

{

perror("ftok error");

return -1;

}

printf("key=%d\n",key) ;

shm_id=shmget(key,4096,IPC_CREAT|IPC_EXCL|0600);

if(shm_id==-1)

{

perror("shmget error");

return -1;

}

printf("shm_id=%d\n", shm_id) ;

p_map=(people*)shmat(shm_id,NULL,0);

memset(temp, 0x00, sizeof(temp)) ;

strcpy(temp,"test") ;

temp[4]=‘0‘;

for(i = 0;i<3;i++)

{

temp[4]+=1;

strncpy((p_map+i)->name,temp,5);

(p_map+i)->age=0+i;

}

shmdt(p_map) ;

return 0 ;

}

(2)下面程序实现从共享内存读消息。

shmread.c源代码如下:

#include <stdio.h>

#include <string.h>

#include <sys/ipc.h>

#include <sys/shm.h>

#include <sys/types.h>

#include <unistd.h>

typedef struct{

char name[8];

int age;

} people;

int main(int argc, char** argv)

{

int shm_id,i;

key_t key;

people *p_map;

char pathname[30] ;

strcpy(pathname,"/tmp") ;

key = ftok(pathname,0x03);

if(key == -1)

{

perror("ftok error");

return -1;

}

printf("key=%d\n", key) ;

shm_id = shmget(key,0, 0);

if(shm_id == -1)

{

perror("shmget error");

return -1;

}

printf("shm_id=%d\n", shm_id) ;

p_map = (people*)shmat(shm_id,NULL,0);

for(i = 0;i<3;i++)

{

printf( "name:%s\n",(*(p_map+i)).name );

printf( "age %d\n",(*(p_map+i)).age );

}

if(shmdt(p_map) == -1)

{

perror("detach error");

return -1;

}

return 0 ;

}

(3)编译与执行

① 编译gcc shmwrite.c -o shmwrite。

② 执行./shmwrite,执行结果如下:

key=50453281

shm_id=688137

③ 编译gcc shmread.c -o shmread。

④ 执行./shmread,执行结果如下:

key=50453281

shm_id=688137

name:test1

age 0

name:test2

age 1

name:test3

age 2

⑤ 再执行./shmwrite,执行结果如下:

key=50453281

shmget error: File exists

⑥ 使用ipcrm -m 688137删除此共享内存。

时间: 2024-11-19 03:28:50

共享内存应用范例的相关文章

(转)Linux环境进程间通信系列(五):共享内存

原文地址:http://www.cppblog.com/mydriverc/articles/29741.html 共享内存可以说是最有用的进程间通信方式,也是最快的 IPC 形式.两个不同进程 A . B 共享内存的意思是,同一块物理内存被映射到进程 A . B 各自的进程地址空间.进程 A 可以即时看到进程 B 对共享内存中数据的更新,反之亦然.由于多个进程共享同一块内存区域,必然需要某种同步机制,互斥锁和信号量都可以. 采用共享内存通信的一个显而易见的好处是效率高,因为进程可以直接读写内存

(转载)linux下的僵尸进程处理SIGCHLD信号Linux环境进程间通信(五): 共享内存(下)

Linux环境进程间通信(五): 共享内存(下) 在共享内存(上)中,主要围绕着系统调用mmap()进行讨论的,本部分将讨论系统V共享内存,并通过实验结果对比来阐述两者的异同.系统V共享内存指的是把所有共享数据放在共享内存区域(IPC shared memory region),任何想要访问该数据的进程都必须在本进程的地址空间新增一块内存区域,用来映射存放共享数据的物理内存页面. 系统调用mmap()通过映射一个普通文件实现共享内存.系统V则是通过映射特殊文件系统shm中的文件实现进程间的共享内

Linux进程间通信--mmap()共享内存(二)

内核怎样保证各个进程寻址到同一个共享内存区域的内存页面 1.page cache及swap cache中页面的区分:一个被访问文件的物理页面都驻留在page cache或swap cache中,一个页面的所有信息由struct page来描述.struct page中有一个域为指针mapping ,它指向一个struct address_space类型结构.page cache或swap cache中的所有页面就是根据address_space结构以及一个偏移量来区分的. 2.文件与addres

Linux进程间通信--shmget()共享内存(二)

共享内存区域是被多个进程共享的一部分物理内存.如果多个进程都把该内存区域映射到自己的虚拟地址空间,则这些进程就都可以直接访问该共享内存区域,从而可以通过该区域进行通信.共享内存是进程间共享数据的一种最快的方法,一个进程向共享内存区域写入了数据,共享这个内存区域的所有进程就可以立刻看到其中的内容.这块共享虚拟内存的页面,出现在每一个共享该页面的进程的页表中.但是它不需要在所有进程的虚拟内存中都有相同的虚拟地址. 图 共享内存映射图 象所有的 System V IPC对象一样,对于共享内存对象的获取

共享内存基础

shmget int shmget(key_t key, size_t size, int flag); key: 标识符的规则 size:共享存储段的字节数 flag:读写的权限 返回值:成功返回共享存储的id,失败返回-1 key_t key-----------------------------------------------    key标识共享内存的键值: 0/IPC_PRIVATE. 当key的取值为IPC_PRIVATE,则函数shmget()将创建一块新的共享内存:如果ke

共享内存mmap学习 及与 shmxxx操作的区别

上一篇学习了共享内存: http://www.cnblogs.com/charlesblc/p/6142139.html 根据这个 http://blog.chinaunix.net/uid-26335251-id-3493125.html 再来一篇: 1. 共享内存允许两个或多个进程共享一给定的存储区,因为数据不需要来回复制,所以是最快的一种进程间通信机制.共享内存可以通过mmap()映射普通文件(特殊情况下还可以采用匿名映射)机制实现,也可以通过系统V共享内存机制实现. 应用接口和原理很简单

shmget共享内存

一. 共享内存介绍 系统V共享内存指的是把所有共享数据放在共享内存区域(IPC shared memory region),任何想要访问该数据的 进程都必须在本进程的地址空间新增一块内存区域,用来映射存放共享数据的物理内存页面.系统调用mmap()通 过映射一个普通文件实现共享内存.系统V则是通过映射shm文件系统中的文件实现进程间的共享内存通信. 也就是说,每个共享内存区域对应shm文件系统的一个文件. 二.系统V共享内存API 对于系统V共享内存,主要有以下几个API:shmget().sh

深入理解进程间通信之共享内存

共享内存可以说是最有用的进程间通信方式,也是最快的IPC形式.是针对其他通信机制运行效率较低而设计的.两个不同进程A.B共享内存的意思是,同一块物理内存被映射到进程A.B各自的进程地址空间.进程A可以即时看到进程B对共享内存中数据的更新,反之亦然.由于多个进程共享同一块内存区域,必然需要某种同步机制,互斥锁和信号量都可以. 采用共享内存通信的一个显而易见的好处是效率高,因为进程可以直接读写内存,而不需要任何数据的拷贝.对于像管道和消息队列等通信方式,则需要在内核和用户空间进行四次的数据拷贝,而共

(转)mmap和shm共享内存的区别和联系

共享内存的创建 根据理论: 1. 共享内存允许两个或多个进程共享一给定的存储区,因为数据不需要来回复制,所以是最快的一种进程间通信机制.共享内存可以通过mmap()映射普通文件 (特殊情况下还可以采用匿名映射)机制实现,也可以通过系统V共享内存机制实现.应用接口和原理很简单,内部机制复杂.为了实现更安全通信,往往还与信号 灯等同步机制共同使用. mmap的机制如:就是在磁盘上建立一个文件,每个进程存储器里面,单独开辟一个空间来进行映射.如果多进程的话,那么不会对实际的物理存储器(主存)消耗太大.