信号量是为了多进程对共享数据的存取,信号量并不是一个单独的非负值,其实信号量定义为一个或者多个信号量值的集合:
struct semid_ds{
struct ipc_perm sem_perm /*许可权控制结构*/
struct sem *sem_base /*指向集合中第一个信号量的地址*/
ushort sem_nsems /*信号量集合中的信号量数目*/
time_t sem_otime;
time_t sem_ctime;
}
其中,struct sem的结构定义如下:
struct sem{
ushort semval; /*具体的信号量的值*/
pid_t sempid; /*上次操作该信号量的进程号*/
ushort semncnt; /*processes awaiting semval>;currcal*/
ushort semzcnt; /*processes awaiting semval=0*/
}
请教:
1。信号量定义成集合的结构,就是说:semget函数获得一个信号量ID后,得到的是一个信号量集合,
如果函数semget的参数nsems 大于1,集合中的信号量有多个,一般对一段共享内存进行同步访问,一个信号量
不就够了吗?对nsems大于1个的情况,具体的应用是什么呢?
(个人猜测:申请一个信号量,对多个共享内存进行同步控制;在调用semctl函数的时候,
参数semnum指向集合中的具体某个信号量)
2。具体到信号量的集合结构内部,如果semget(key-t key,int 5,int flag)申请到了5个信号量,
函数semop(int semid,struct sembuf semoparray[],size_t nops)中的参数semoparray是个信号量操作数组
struct sembuf{
ushort sem_num /*具体到信号量集合中的某个信号量*/
short sem_op /*对该信号量的操作(负数,0,正数)*/
short sem_flg /*ipc_nowait,sem_undo*/
}
在unix高级编程一书中,这么定义的,但是我没有遇到过申请一个信号量集合中信号数大于1的,
有实际经验的朋友,大家来讨论!
还有就是:结构struct sem 中的semncnt 和 semzcnt变量做何解释?