共享内存
共享内存可以说是最有用的进程间通信方式,也是最快的IPC形式。两个不同进程A、B共享内存的意思是,同一块物理内存被映射到进程A、B各自的进程地址空间。进程A可以即时看到进程B对共享内存中数据的更新,反之亦然。由于多个进程共享同一块内存区域,必然需要某种同步机制,互斥锁和信号量都可以。
共享内存实现分为两个步骤:
一、创建共享内存,使用shmget函数。
二、映射共享内存,将这段创建的共享内存映射到具体的进程空间去,使用shmat函数。
系统调用:shmget( ) ;
原型:int shmget ( key_t key, int size, int shmflg );
返回值:如果成功,返回共享内存段标识符。
如果失败,则返回- 1:
errno = EINVAL (无效的内存段大小)
EEXIST (内存段已经存在,无法创建)
EIDRM (内存段已经被删除)
ENOENT (内存段不存在)
EACCES (权限不够)
ENOMEM (没有足够的内存来创建内存段)
系统调用:shmat();
原型:int shmat ( int shmid, char *shmaddr, int shmflg);
返回值:如果成功,则返回共享内存段连接到进程中的地址。
如果失败,则返回- 1:
errno = EINVAL (无效的IPC ID 值或者无效的地址)
ENOMEM (没有足够的内存)
EACCES (存取权限不够)
当一个进程不在需要共享的内存段时,它将会把内存段从其地址空间中脱离。
系统调用:shmdt();
调用原型:int shmdt ( char *shmaddr );
返回值:如果失败,则返回- 1:
errno = EINVAL (无效的连接地址)
使用共享内存和使用malloc来分配内存区域很相似。使用共享内存的方法是:
1. 对一个进程/线程使用shmget分配内存区域。
2. 使用shmat放置一个或多个进程/线程在共享内存中,你也可以用shmctl来获取信息或者控制共享区域。
3. 使用shmdt从共享区域中分离。
4. 使用shmctl解除分配空间
信号量
#include <sys/sem.h> int semget(key_t key,int nsems, int flag); Returns:semaphore ID if OK,-1 on error.
#include <sys/sem.h> int semctl(int semid,int semnum,int cmd, ... /* union semun arg */); Returns:(see following).
#include <sys/sem.h> int semop(int semid,struct sembuf semoparray [],size_t nops); Return: 0 if OK,-1 on error.