文档介绍:第4章进程间通信 3
11/29/2017
1
操作系统与实验第4章3
Linux信号量
Linux的信号量
作为IPC机制的一种,与上述其它通信方式类似,也要通过kern_ipc_perm结构中的key来唯一标识一个信号量集,并通过该结构设置并检查访问权限。
针对信号量集,系统中维护了一个由信号量集组成的数组,数组中的每个单元指向一个信号量集。每一个信号量集由一个sem_array结构来描述,该结构定义在文件/usr/src/linux-。
11/29/2017
2
操作系统与实验第4章3
Linux的信号量
11/29/2017
3
操作系统与实验第4章3
有关信号量的系统调用函数
Linux提供下列3个有关信号量的系统调用函数:
semget()
semop()
semctl()
下面分别予以介绍。
11/29/2017
4
操作系统与实验第4章3
有关信号量的系统调用函数
命令格式:
int semget(key_t key, int nsems, int semflg);
返回值:
正确返回:信号量集的标识符
错误返回:-1
11/29/2017
5
操作系统与实验第4章3
参数说明:
key——信号量集的key值:
①.使用IPC_PRIVATE,由系统产生key值并返回标识符,或者返回key值已存在的信号量集的标识符。
②. key值不为IPC_PRIVATE而是由用户指定一个非0整型数值,则对信号量集的打开或存取操作依赖于semflag参数的取值。
nsems——指定打开或者新创建的信号量集将包含的信号量的数目;如果该key值的信号量集已存在,而semflg只指定了IPC_CREAT标志,那么参数nsems必须与原来的值一致,否则也会返回错误信息。该参数最大值在linux/:
#define SEMMSL 250 /* <= 8 000 */
semflg——当key值不为IPC_PRIVATE:
①.若只设置semflag的IPC_CREAT位,则创建一个信号量集,如果该信号量集已经存在,则返回其标识符
②.若设置semflag的IPC_CREAT|IPC_EXCL位,则创建一个新的信号量集,如果该key值的信号量集已经存在则返回错误信息
③.只设置IPC_EXCL位而不设置IPC_CREAT位没有任何意义。
11/29/2017
6
操作系统与实验第4章3
实验中,使用该调用创建一个只含一个信号量的信号量集,格式为:
semid=semget(IPC_PRIVATE,1, IPC_CREAT|0666);
其中的IPC_PRIVATE可以使用具体的整型数值取代。
11/29/2017
7
操作系统与实验第4章3
、V操作
命令格式:
int semop(int semid, struct sembuf * sops, unsigned nsops);
返回值:
正确返回:0
错误返回:-1
参数说明:
semid——信号量集的标识符,由semget()得到。
sops——指向一个sembuf结构数组,该数组的每个元素对应一次信号量操作。
11/29/2017
8
操作系统与实验第4章3
、V操作
其sembuf数据结构如下:
struct sembuf
{
unsigned short sem_num; /* semaphore index in array */
short sem_op; /* semaphore operation */
short sem_flg; /* operation flags */
};
其中的参数含义如下所示:
11/29/2017
9
操作系统与实验第4章3
、V操作
⑴.信号量的sem_num值标明它是信号量集的第几个元素,第一个信号量为0,第二个为1,依次类推。
⑵.semop确定对sem_num指定的信号量采取何种操作,它可以为负数、正数和零。
①.如果sem_op为负数:则相当于P操作,从信号量的值中减去sem_op的绝对值:
       其差如果大于0,则表示该进程可以使用临界资源进入临界区;
      其差如果小于0,在没有指定IPC_NOWAIT的情况下,该进程睡眠,并插入sem_queues等待队列尾部,直到请求的条件得