系统会对传递给semget(2)的关键字的值进行检查来查看这个
信号量是否已经存在了,并通过使用ipc支持例程ipcaccess()进行权限检查。
信号量的权限和我们在Solaris文件中使用的权限模式有点不同。这些权限被定义程READ和ALTER,这样进程就可以读取当前
信号量的值或者对该值进行修改(增大/减小)。这两个权限是通过传递给semget(2)调用的参数来建立的,它使用Solaris文件权限中通用的属主、组和其他用户的概念。
假设有一个新的
信号量,根据紧接的下一步操作就是对信号量值进行初始化。初始化操作使用semctl(2)调用来实现,它使用SETVAL来设置某个时间点上这个集合中每个
信号量的值(或者这个集合中只用一个信号量,那么就设置这个信号量的值),或者使用SETALL来设置一个操作中该集合中所有信号量的值。
内核的实际流程是明确的,它使用期望的权限和值对可能的最大值进行检查,如果所有的检查都通过了,那么久设置用户定义的值。
应用程序代码对
信号量的实际使用会调用semop(2)
系统调用。semop(2)调用使用
信号量的ID(由semget(2)返回)、一个指向sembuf结构的
指针和信号量操作的个数作为参数。sembuf结构包含一下元素。
程序员必须创建sembuf结构并对其进行初始化,设置semaphore编号(说明它是集合中的哪一个
信号量)、操作和标志。sem_op的值决定了信号量操作是对信号量进行修改还是读取这个信号量的值。非0的sem_op值可以增大
信号量的值,也可以减小信号量的值。值为0的sem_op只是简单的读取
信号量的值。