文档介绍:优秀精品课件文档资料
第4章进程间通信 3
2017/11/18
操作系统与实验第4章3
3
Linux信号量
Linux的信号量
作为IPC机制的一种,与上述其它通信方式类似,也要通过kern_ipc_perm结构中的key来唯一标识一个信号量集,并通过该结构设置并检查访问权限。
针对信号量集,系统中维护了一个由信号量集组成的数组,数组中的每个单元指向一个信号量集。每一个信号量集由一个sem_array结构来描述,该结构定义在文件/usr/src/linux-。
2017/11/18
操作系统与实验第4章3
4
Linux的信号量
2017/11/18
操作系统与实验第4章3
5
有关信号量的系统调用函数
Linux提供下列3个有关信号量的系统调用函数:
semget()
semop()
semctl()
下面分别予以介绍。
2017/11/18
操作系统与实验第4章3
6
有关信号量的系统调用函数
命令格式:
int semget(key_t key, int nsems, int semflg);
返回值:
正确返回:信号量集的标识符
错误返回:-1
2017/11/18
操作系统与实验第4章3
7
参数说明:
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位没有任何意义。
2017/11/18
操作系统与实验第4章3
8
实验中,使用该调用创建一个只含一个信号量的信号量集,格式为:
semid=semget(IPC_PRIVATE,1, IPC_CREAT|0666);
其中的IPC_PRIVATE可以使用具体的整型数值取代。
2017/11/18
操作系统与实验第4章3
9
、V操作
命令格式:
int semop(int semid, struct sembuf * sops, unsigned nsops);
返回值:
正确返回:0
错误返回:-1
参数说明:
semid——信号量集的标识符,由semget()得到。
sops——指向一个sembuf结构数组,该数组的每个元素对应一次信号量操作。
2017/11/18
操作系统与实验第4章3
10
、V操作
其sembuf数据结构如下:
struct sembuf
{
unsigned short sem_num; /* semaphore index in array */
short sem_op; /* semaphore operation */
short sem_flg; /* operation flags */
};
其中的参数含义如下所示: