进程间通信(三)共享内存和信号量

共享内存
共享内存可以说是最有用的进程间通信方式,也是最快的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.

 

posted @ 2012-05-28 21:02  龍傲霜  阅读(636)  评论(0编辑  收藏  举报