请输入您要查询的百科知识:

 

词条 信号量操作
释义

简介

应用程序创建信号量集需要调用semget(2)。系统中每个信号量集由一个semds_id数据结构描述,其中包括以下元素:

struct semid_ds {

struct ipc_perm sem_perm; /* operation permission struct */

struct sem *sem_base; /* ptr to first semaphore in set */

ushort_t sem_nsems; /* # of semaphores in set */

#if defined(_LP64)

time_t sem_otime; /* last semop time */

time_t sem_ctime; /* last change time */

#else /*_LP64*/

time_t sem_otime; /* last semop time */

int32_t sem_pad1; /* reserved for time_t expansion */

time_t sem_ctime; /* last change time */

int32_t sem_pad2; /* time_t expansion */

#endif /*_LP64*/

int sem_binary; /* flag indicating semaphore type */

long sem_pad3[3]; /* reserve area */

};

解释

系统会对传递给semget(2)的关键字的值进行检查来查看这个信号量是否已经存在了,并通过使用ipc支持例程ipcaccess()进行权限检查。信号量的权限和我们在Solaris文件中使用的权限模式有点不同。这些权限被定义程READ和ALTER,这样进程就可以读取当前信号量的值或者对该值进行修改(增大/减小)。这两个权限是通过传递给semget(2)调用的参数来建立的,它使用Solaris文件权限中通用的属主、组和其他用户的概念。

假设有一个新的信号量,根据紧接的下一步操作就是对信号量值进行初始化。初始化操作使用semctl(2)调用来实现,它使用SETVAL来设置某个时间点上这个集合中每个信号量的值(或者这个集合中只用一个信号量,那么就设置这个信号量的值),或者使用SETALL来设置一个操作中该集合中所有信号量的值。内核的实际流程是明确的,它使用期望的权限和值对可能的最大值进行检查,如果所有的检查都通过了,那么久设置用户定义的值。

应用程序代码对信号量的实际使用会调用semop(2)系统调用。semop(2)调用使用信号量的ID(由semget(2)返回)、一个指向sembuf结构的指针和信号量操作的个数作为参数。sembuf结构包含一下元素。

struct sembuf {

ushort_t sem_num; /* semaphore # */

short sem_op; /* semaphore operation */

short sem_flg; /* operation flags */

};

补充

程序员必须创建sembuf结构并对其进行初始化,设置semaphore编号(说明它是集合中的哪一个信号量)、操作和标志。sem_op的值决定了信号量操作是对信号量进行修改还是读取这个信号量的值。非0的sem_op值可以增大信号量的值,也可以减小信号量的值。值为0的sem_op只是简单的读取信号量的值。

随便看

 

百科全书收录4421916条中文百科知识,基本涵盖了大多数领域的百科知识,是一部内容开放、自由的电子版百科全书。

 

Copyright © 2004-2023 Cnenc.net All Rights Reserved
更新时间:2025/2/27 4:44:36