|
Linux 下使用系统函数 semget 创建或打开信号集。这个函数定义在头文件<sys/sem.h> 中,函数原型如下:
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
int semget(key_t key, int nsems, int semflg);
第 1 个参数 key 是经由 ftok() 得到的键值;
第 2 个参数 nsems 指明要创建的信号集包含的信号个数,如果只是打开信号集,则将 nsems 设置为 0 即可;
第 3 个参数 semflg 为操作标志,可以取如下值:
IPC_CREATE : 调用 semget 时,它会将此值与系统中其他信号集的 key 进行对比,如果存在相同的 key ,说明信号集已存在,此时返回该信号值的标识符,否则创建一个新的信号集并返回其标识符。 IPC_EXCL : 该宏必须和 IPC_CREATE 一起使用,否则没有意义。当 semflg 取 IPC_CREATE|IPC_EXCL 时,表示如果发现信号集已经存在,则返回错误,错误码为 EEXIST 。 如果 semget() 创建了新的信号量集,则信号量中将有 nsems 个信号量,并且与该信号量集关联的 semid_ds 结构如下初始化:
sem_perm.cuid , sem_perm.uid , sem_perm.cgid 和 sem_perm.gid 成员被初始化为调用进程的有效用户 ID 和有效组 ID 。 sem_nsems 成员被设置为 nsmes 的值。 注意,semget() 并没有初始化信号量集中的信号量的实际值,要初始化信号量的实际值必须改用 semctl() 函数。 |
|