--------参考文献 W.Richard Stevens, Stephen A.Rago.UNIX环境高级编程[M].北京:人民邮电出版社,2014.6:455-459.
目录
一、问题引出
1.1 情景模拟
某进程向某个txt文件写入"hello",另一进程向该txt文件读出已经写入的"hello"并在屏幕上打印输出。
毋庸置疑,写完了才能读取,读取完了才能写入。这两个进程运行时就需要额外施加同步控制(边读边写会导致不可预料的后果)。在本情景下,该txt文件被看成是资源,而且只有一份。
生活中,比较贴切的例子就是打印店的打印机,假设打印机一共有5台,每台电脑到底使用哪台打印机是未知的,因为电脑对任何一台打印机都没有特殊要求。打印机就被看成是资源,而且有5份。
举这个例子是为了说明,资源不是总是只有1份的,而且申请资源或释放资源时不总是一份份地申请或释放。一切都按照实际需求去做。
1.2 设计方案
如图1所示,自主实现的函数用蓝色圆角矩形框起来,库函数用橘色椭圆框起来, 我们实现的,实际上更多的是业务处理,并非底层实现。自主实现的函数内部到最后都会去转调库函数(代理)。
1.3 相关知识
创建一个信号量集或者打开一个现有信号量集函数semget
#include<sys/sem.h>
int semget(key_t key, int nsems, int flag);
//返回值:若成功,返回信号量ID;若出错,返回-1。
- key用于变换标识符。