学习简单的Unix信号量
Unix信号量(SEMAPHORE)则是防止两个或多个进程同时访问共享资源的一种机制在Unix信号量机制实现之前通常采用加锁文件的方法信号量(Semaphore)有时被称为信号灯是在多线程环境下使用的一种设施是可以用来保证两个或多个关键代码段不被并发调用在进入一个关键代码段之前线程必须获取一个信号量一旦该关键代码段完成了那么该线程必须释放信号量
其它想进入该关键代码段的线程必须等待直到第一个线程释放信号量为了完成这个过程需要创建一个信号量VI然后将Acquire Semaphore VI以及Release Semaphore VI分别放置在每个关键代码段的首末端确认这些信号量VI引用的是初始创建的信号量UNIXSYSTEMV以一个长整数的键值作为Unix信号量集合的唯一标识Unix信号量通常由下列元素组成:
①信号量的值
②操作该信号量的最后一个进程的进程标识
③等待增加该信号量的值的进程数
④等待该信号量的值为的进程数
与之有关的系统调用如下:
#include <sys/typesh>
#include <sys/ipch>
#include <sys/semh>
int semget(keycountflags)
/*获取信号量集合的标识符*/
key_tkey; /*信号量集合的键*/
intcount; /*信号量集合中元素个数*/
intflags; /*任选参数*/
/*返回信号量集合标识符若出错则返回*/
int semop(sidopsnops) /*信号量操作*/
int sid; /*信号量集合标识符*/
struct sembuf *ops; /*信号量操作结构的指针*/
intnops; /*信号量操作结构的个数*/
/*返回运算完成前该组信号量中最后一个被运算的信号量的
值若出错则返回*/
int semctl(sidsemnumcmdarg)
/*控制信号量操作*/
intsid; /*信号量集合标识符*/
intsemnum; /*信号量元素编号*/
intcmd; /*控制命令*/
union semun{
intval;
struct semid_ds *buf;
ushort*array;} arg; /*命令参数*/