共享内存和信号量实现进程间通信的另外两种机制。
一. 共享内存
1. 共享内存的结构
2. 实现共享内存的函数
(1)shmget 函数
功能:创建共享内存
参数:key 共享内存的名字 ,size 共享内存的大小(以页为单位分配资源)
返回值:成功返回一个非负整数,即共享内存的标识符;失败返回-1。
(2)shmat 函数
功能:将共享内存块连接到进程地址空间
参数:shmid 共享内存标识符,shmaddr 一般取值NULL ,shmflg 一般取值为0;
返回值:成功返回一个指针;失败返回一个-1;
(3)shmdt 函数
功能:将共享内存段和进程地址空间去关联
参数:shmaddr 是由shmat 返回的指针
返回值:成功返回0;失败返回-1;
(4)shmctl 函数
功能:用于控制共享内存
参数:shmid 由shmget 返回的共享内存的标识符;cmd 是要执行的动作,有三个值可以取;
返回值:成功返回0;失败返回-1;
3. 共享内存的特点
(1)共享内存是最快的IPC形式,因为一旦共享内存创建成功,就会由页表映射到进程地址空间,进程间的数据不需要传递到内核。
(2)共享内存没有同步与互斥机制,在使用时需要自己维护代码。
(3)共享内存的生命周期随内核。
4. 关于共享内存的命令
(1)ipcs -m : 显示IPC内容
(2)ipcrm -m :手动命令删除共享内存
二 . 信号量
在看信号量之前,我们先来看几个概念:
(1)临界资源:多个进程看到的同一个资源(公共资源);
(2)临界区:访问临界资源的代码;
(3)同步性:在一段时间内,按照一定的顺序访问 ;
(4)互斥性:在一段时间内,一份资源只能被一个进程访问 和占用 ;
(5)原子性: 一个事物要么全做,要么不做,不能只做一半 ;
1. 信号量的概念
(1)信号量本质上是计数器,是衡量临界资源的数量的 ;
(2)信号量也是一种临界资源,它的作用是保护临界资源 ;
(3)信号量只有两种操作,PV原语,P表示申请资源,V表示释放资源;
P原语
V原语
(4) PV 操作保持原子性 ;
2. 信号量集函数
(1) semget 函数
功能:创建和访问一个信号量集
参数:key 信号量的名字 ,nsems 信号量集中信号量的个数
返回值:成功返回一个非负整数,即信号量的标识符;失败返回-1。
(2)semctl 函数
功能:信号量控制函数
参数:semid 信号量的标识符 ,semnum 信号量的序号,cmd和共享内存相同 ;
返回值:成功返回0; 失败返回-1;
(3)semop 函数
功能:创建和访问一个信号量集
参数:semid 信号量的标识符
返回值:成功返回0; 失败返回-1;
信号量的内容比较难理解,我们要仔细琢磨!