进程间通信IPC之--共享内存
每个进程各自有不同的用户地址空间,任何一个进 程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲 区,进程1把数据从用户空间拷到内核缓冲区,进程2再从内核缓冲区把数据读走,内核提供的这种机制称为进程间通信(IPC,InterProcess Communication)

# 管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。
# 有名管道 (named pipe) : 有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。
# 信号量( semophore ) : 信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。
# 消息队列( message queue ) : 消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
# 共享内存( shared memory ) :共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号两,配合使用,来实现进程间的同步和通信。
#define IPCKEY 0x344378
IPC_CREAT 新建(如果已创建则返回目前共享内存的id)
IPC_EXCL 与IPC_CREAT结合使用,如果已创建则则返回错误
返回值: 成功时,这个函数返回共享内存的起始地址。失败时返回-1。
参数说明:
cmd:控制命令,可取值如下:
IPC_STAT 得到共享内存的状态
IPC_SET 改变共享内存的状态
IPC_RMID 删除共享内存
buf:一个结构体指针。用以保存/设置属性。IPC_STAT的时候,取得的状态放在这个结构体中。如果要改变共享内存的状态,用这个结构体指定。
返回值:成功时返回0。失败时返回-1。
- /*name:writer.c
- *function:写端进程向共享内存写数据
- * */
- #include <stdio.h>
- #include <stdlib.h>
- #include <unistd.h>
- #include <errno.h>
- #include <signal.h>
- #include <string.h>
- #include <sys/types.h>
- #include <sys/ipc.h>
- #include <sys/shm.h>
- #define N 64
- typedef struct
- {
- pid_t pid;
- char buf[N];
- } SHM;
- void handler(int signo)
- {
- //printf("get signal\n");
- return;
- }
- int main()
- {
- key_t key;
- int shmid;
- SHM *p;
- pid_t pid;
- if ((key = ftok(".", 'm')) < 0)
- {
- perror("fail to ftok");
- exit(-1);
- }
- signal(SIGUSR1, handler);//注册一个信号处理函数
- if ((shmid = shmget(key, sizeof(SHM), 0666|IPC_CREAT|IPC_EXCL)) < 0)
- {
- if (EEXIST == errno)//存在则直接打开
- {
- shmid = shmget(key, sizeof(SHM), 0666);
- p = (SHM *)shmat(shmid, NULL, 0);
- pid = p->pid;
- p->pid = getpid();
- kill(pid, SIGUSR1);
- }
- else//出错
- {
- perror("fail to shmget");
- exit(-1);
- }
- }
- else//成功
- {
- p = (SHM *)shmat(shmid, NULL, 0);
- p->pid = getpid();//把自己的pid写到共享内存
- pause();
- pid = p->pid;//得到读端进程的pid
- }
- while ( 1 )
- {
- printf("write to shm : ");
- fgets(p->buf, N, stdin);//接收输入
- kill(pid, SIGUSR1);//向读进程发SIGUSR1信号
- if (strcmp(p->buf, "quit\n") == 0) break;
- pause();//阻塞,等待信号
- }
- shmdt(p);
- shmctl(shmid, IPC_RMID, NULL);//删除共享内存
- return 0;
- }
- /*name:reader.c
- *function:读端进程从共享内存中读数据
- * */
- #include <stdio.h>
- #include <stdlib.h>
- #include <unistd.h>
- #include <errno.h>
- #include <signal.h>
- #include <string.h>
- #include <sys/types.h>
- #include <sys/ipc.h>
- #include <sys/shm.h>
- #define N 64
- typedef struct
- {
- pid_t pid;
- char buf[N];
- } SHM;
- void handler(int signo)
- {
- //printf("get signal\n");
- return;
- }
- int main()
- {
- key_t key;
- int shmid;
- SHM *p;
- pid_t pid;
- if ((key = ftok(".", 'm')) < 0)
- {
- perror("fail to ftok");
- exit(-1);
- }
- signal(SIGUSR1, handler);//注册一个信号处理函数
- if ((shmid = shmget(key, sizeof(SHM), 0666|IPC_CREAT|IPC_EXCL)) < 0)
- {
- if (EEXIST == errno)//存在则直接打开
- {
- shmid = shmget(key, sizeof(SHM), 0666);
- p = (SHM *)shmat(shmid, NULL, 0);
- pid = p->pid;
- p->pid = getpid();//把自己的pid写到共享内存
- kill(pid, SIGUSR1);
- }
- else//出错
- {
- perror("fail to shmget");
- exit(-1);
- }
- }
- else//成功
- {
- p = (SHM *)shmat(shmid, NULL, 0);
- p->pid = getpid();
- pause();
- pid = p->pid;//得到写端进程的pid
- }
- while ( 1 )
- {
- pause();//阻塞,等待信号
- if (strcmp(p->buf, "quit\n") == 0) exit(0);//输入"quit结束"
- printf("read from shm : %s", p->buf);
- kill(pid, SIGUSR1);//向写进程发SIGUSR1信号
- }
- return 0;
- }

进程间通信IPC之--共享内存的更多相关文章
- 进程间通信——IPC之共享内存
共享内存是三个IPC机制中的一个.它允许两个不相关的进程访问同一个逻辑内存.共享内存是在两个正在进行的进程之间传递数据的一种非常有效的方式. 大多数的共享内存的实现,都把由不同进程之间共享 ...
- 【Linux 应用编程】进程管理 - 进程间通信IPC之共享内存 mmap
IPC(InterProcess Communication,进程间通信)是进程中的重要概念.Linux 进程之间常用的通信方式有: 文件:简单,低效,需要代码控制同步 管道:使用简单,默认阻塞 匿名 ...
- Linux进程间通信(System V) --- 共享内存
共享内存 IPC 原理 共享内存进程间通信机制主要用于实现进程间大量的数据传输,下图所示为进程间使用共享内存实现大量数据传输的示意图: 共享内存是在内存中单独开辟的一段内存空间,这段内存空间有自己特有 ...
- System IPC 与Posix IPC(共享内存)
系统v(共享内存) 1.对于系统V共享内存,主要有以下几个API:shmget().shmat().shmdt()及shmctl(). 2.shmget()用来获得共享内存区域的ID,如果不存在指定的 ...
- Linux IPC之共享内存C 事例
Linux IPC之共享内存 标签: linuxrandomnull工作 2011-08-25 11:52 4123人阅读 评论(0) 收藏 举报 分类: Linux(3) 读书札记(3) 版权 ...
- 五十、进程间通信——System V IPC 之共享内存
50.1 共享内存 50.1.1 共享内存的概念 共享内存区域是被多个进程共享的一部分物理内存 多个进程都可把该共享内存映射到自己的虚拟内存空间.所有用户空间的进程若要操作共享内存,都要将其映射到自己 ...
- System V IPC 之共享内存
IPC 是进程间通信(Interprocess Communication)的缩写,通常指允许用户态进程执行系列操作的一组机制: 通过信号量与其他进程进行同步 向其他进程发送消息或者从其他进程接收消息 ...
- Linux 进程间通信(管道、共享内存、消息队列、信号量)
进程通信 : 不同进程之间传播或交换信息 为什么要进程通信呢? 协同运行,项目模块化 通信原理 : 给多个进程提供一个都能访问到的缓冲区. 根据使用场景,我们能划分为以下几种通信 ...
- Linux进程间通信之《共享内存》入门
目录 简述 代码 写端代码 读取端代码 编译 运行 简述 共享内存是Linux系统进程间通信常用的方式,通常用于数据量较大的情况,如果只是用于不同的进程间消息通知,那不如用消息队列或者socket.之 ...
随机推荐
- cdoj 482 优先队列+bfs
Charitable Exchange Time Limit: 4000/2000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Othe ...
- html5的特性
1.简化的语法更简单的doctype声明是HTML5里众多新特征之一.现在你只需要写,这就行了.HTML5的语法兼容HTML4和XHTML1,但不兼容SGML. 2. 一个替代Flash的新”canv ...
- C与Python变量的区别
C中变量有类型,代表一定内存. 而Python变量只是封装过的指针,没有类型.如果不指向对象,就没有意义,更谈不上类型. python中 a=b,和C中 a=b是完全不同的两个操作.前者只是指针(引用 ...
- google-http-java-client(android学习篇2源码)
package com.google.api.services.samples.googleplus.cmdline.simple; import com.google.api.client.ht ...
- Python Tornado
按照http://www.tornadoweb.cn/所提供的方法下载安装后编写如下程序: import tornado.ioloop import tornado.web class MainHan ...
- JS构造函数详解
//构造函数 //使自己的对象多次复制,同时实例根据设置的访问等级可以访问其内部的属性和方法 //当对象被实例化后,构造函数会立即执行它所包含的任何代码 function myObject(msg) ...
- spring源码学习之:xml配置文件标签自定义
Spring框架从2.0版本开始,提供了基于Schema风格的XML扩展机制,允许开发者扩展最基本的spring配置文件(一 般是classpath下的spring.xml).试想一下,如果我们直接在 ...
- Unity3D 几个基本动画(控制物体移动、旋转、缩放)
Transform基本移动函数: 1.指定方向移动: //移动速度 float TranslateSpeed = 10f; //Vector3.forward 表示"向前" tra ...
- NetHogs下载和监控
转自:http://blog.csdn.net/testcs_dn/article/details/40506225 CentOS6.5下使用NetHogs监控进程网络使用情况 分类: CentOS2 ...
- JS页面间传值
一:JavaScript静态页面值传递之URL篇 能过URL进行传值.把要传递的信息接在URL上. 例子: 参数传出页面Post.htm—> <input type="tex ...