信号量(信号灯)与其他进程间访问方式不同,它的用途主要是保护临界资源。进程可以根据信号量来判断能否访问某些共享资源,实际上它是一个整数,信号量还可以用于进程的同步。
信号量分为:
1、二值信号灯:信号灯只有0和1两个值,类似互斥锁。当两者有不同:信号灯强调共享资源,只要共享资源可用,其他进程同样可以修改信号灯的值;互斥锁更强调进程,占用资源的进程使用完资源后,必须由进程本身来解锁。
2、技术信号灯:此时存在多个可用共享资源,信号灯的取值为资源的数目。
# include <sys/types.h>
# include <sys/ipc.h>
# include <sys/sem.h>
int semget(key_t key, int nsems, int semflg)
功能:创建一个新的信号量或得到一个已存在的信号量键值。
key:一个用来允许不相关的进程访问相同信号量的整数值。所有的信号量是为不同的程序通过提供一个key来间接访问的,对于每一个信号量系统生成一个信号量标识符。信号量键值只可以有semget获得,所有其他的信号量函数所用的信号量标识符都是由semget所返回的。
nsems:指定打开或者新创建的信号灯集中将包含信号灯的数目,这个值通常为1。
semflg:是一个标记集合,与open函数的标记十分类似,低九位为信号的权限,其作用与文件权限类似。
返回值:如果成功,semget函数会返回一个正数;这是用于其他信号量函数的标识符。如果失败,则会返回-1.
int semop(int semid, struct sembuf *sops, unsigned nsops)
功能:对信号量进行控制。
semid:是由semget函数所返回的信号量标识符。
nsops:sops所指向的数组的元素个数(结构的个数)
sops:是一个指向结构数组的指针,其中每一个结构至少包括下列成员:
struct sembuf
{
unsigned short sem_num;
short sem_op:
short sem_flg;
}
sem_num:要操作的信号量在信号量集中的编号,第一个信号的编号是0.
sem_op;如果其值为正数,该值会加到现有的信号量值中,通常用于释放信号量;如果sem_op的值为负数,而其绝对值又大于信号的现值,操作将会阻塞,直到信号值大于或等于sem_op的绝对值,通常用于获取信号量;如果sem_op的值为0,则操作将暂时阻塞,直到信号的值变为0。
sem_flg:信号操作标志,可能的选择有两种:
1、IPC_NOWAIT:对信号的操作不能满足时,semop()不会阻塞,并立即返回,同时设定错误信息。
2、IPC_UNDO:程序结束时(不论正常或不正常)释放信号量,这样做的目的在于避免程序在异常情况下结束时未将锁定的资源解锁,造成该资源永远锁定。
semop的所用的动作会同时作用,从而避免多个信号量的使用所引起的竞争条件。
更多内容可参考:http://www.cnblogs.com/hjslovewcl/archive/2011/03/03/2314341.html