信号量
信号量本质上就是共享资源的数目,用来控制对共享资源的访问;
信号量可用于进程间的同步和互斥;
每种共享资源对应一个信号量,信号量集就是有很多信号量,便于大量共享资源的操作,信号量集中的所有操作可以要求全部成功,也可以部分成功;
二元信号量(信号灯)值为0和1;
对信号量的操作就是进行PV操作;
信号量集的属性:
信号量集的创建:
int semget(key_t key,int nsems,int flag)
成功返回信号量集id,失败-1
参数:
key:用户指定的信号量集的key
nsems:信号量集中信号量的个数
flag:IPC_CREAT、IPC_EXCL等
@1.创建信号量集(这个集合里有多少个信号量)
信号量集控制:
int semctl(int semid,int semnum,int cmd,.../*union semun arg*/)
union semun{//根据cmd来确定联合体中的值,只能有一个
int val;
struct semid_ds *buf;
unsigned short *array;
}
如果cmd为红框中的值,则联合体为buf;
如果cmd为绿框中的值,则联合体为val;
如果cmd为黄框中的值,则联合体为array;
参数:
semid:信号量集id
semnum:0表示对所有信号量操作,1表示对第一个信号量操作,2表示对第二个信号量操作,以此类推
buf:信号量集属性指针
val:获取或设置信号量集中的某个信号量的值
array:获取或设置信号量集中的所有信号量的值
@2.对创建的信号量集做初始化(即给每个信号量赋初值)
对信号量集的操作:
int semop(int semid,struct sembuf *sops,size_t nsops)
成功返回0,失败-1
struct sembuf{
unsigned short sem_num;//信号量集中信号量的编号(即哪个信号量),0代表第1个信号量
short sem_op;//正数为V操作(加操作,1为加1操作,2为加2操作),负数为P操作(减操作,-1为减1操作,-2为减2操作)
short sem_flg;//SEM_UNDO或IPC_NOWAIT,SEM_UNDO表示进程结束时,相应的操作被取消。如果设置该标志,进程在没有释放共享资源就退出时,内核将代为释放
}
参数:
semid:信号量集id
sops:sembuf结构体数组
nsops:第二个参数中结构体数组长度
可做信号量的加减操作(PV操作),用于互斥和同步
@3.一个sembuf结构体数组就代表一个信号量,可以对确定的信号量做PV操作(即对sops[0](第一个信号量)做P操作,对sops[1](第二个信号量)做V操作)