标签:target 设置 ipc sig 一般来说 阻塞 高亮 min 复制
摘自:https://blog.csdn.net/shenwansangz/article/details/44259349
信号量集
当利用信号量机制解决了单个资源的互斥访问后,我们讨论如何控制同时需要多个资源的互斥访问。信号量集是指同时需要多个资源时的信号量操作。
一般来说,我们也可以把各进程之间发送的消息作为信号量看待。
与进程互斥时不同的是,这里的信号量只与制约进程及被制约进程有关而不是与整组并发进程有关。因此,我们称该信号量为私用信号量(Private Semaphore)。
一个进程Pi的私用信号量Semi是从制约进程发送来的进程Pi的执行条件所需要的消息。
互斥时使用的信号量为公用信号量
----------------------------------------------------我是分隔线-------------------------------------------------
semctl函数对一个信号量执行各种控制操作。
semctl() 在 semid 标识的信号量集上,或者该集合的第semnum 个信号量上执行 cmd 指定的控制命令。(信号量集合索引起始于零。)
根据 cmd 不同,这个函数有三个或四个参数。当有四个参数时,第四个参数的类型是 unionsemun。调用程序 必须按照下面方式定义这个联合体:
union semun {
int val; // SETVAL使用的值
struct semid_ds *buf; // IPC_STAT、IPC_SET 使用缓存区
unsigned short *array; // GETALL,、SETALL 使用的数组
struct seminfo *__buf; // IPC_INFO(Linux特有) 使用缓存区
};
注意:该联合体没有定义在任何系统头文件中,因此得用户自己声明。(centos6.5中/linux/sem.h可以找到)
semid_ds 数据结构在头文件 <sys/sem.h> 有如下定义:
struct semid_ds {
struct ipc_perm sem_perm; // 所有者和权限
time_t sem_otime; // 上次执行 semop 的时间
time_t sem_ctime; // 上次更新时间
unsigned short sem_nsems; // 在信号量集合里的索引
};
结构体 ipc_perm 在头文件 <sys/ipc.h> 中的定义如下(高亮的字段可以使用 IPC_SET 设置):
struct ipc_perm {
key_t __key; // 提供给 semget()的键
uid_t uid; // 所有者有效 UID
gid_t gid; // 所有者有效 GID
uid_t cuid; // 创建者有效 UID
gid_t cgid; // 创建者有效 GID
unsigned short mode; // 权限
unsigned short __seq; // 序列号
};
cmd 的有效值是:
struct seminfo {
int semmap; // 信号量映射里的条数,内核未使用
int semmni; // 信号量集合的最大个数
int semmns; // 在所有信号量集合里信号量个数上限
int semmnu; // 系统范围内的 undo 结构最大个数,内核未使用
int semmsl; // 一个信号量集合里信号量个数上限
int semopm; // 执行的最大操作个数
int semume; // 每个进程内 undo 结构最大个数,内核未使用
int semusz; // 结构 sem_undo 的尺寸
int semvmx; // 信号量值的上限
int semaem; // Max. value that can be recorded for semaphore adjustment (SEM_UNDO)
};semmsl、semmns、semopm 和 semmni 设置可以通过/proc/sys/kernel/sem 更改。
失败时 semctl() 返回 -1 并设置 errno 指明错误。 否则该系统调用返回一个依赖于 cmd 的非负值:
标签:target 设置 ipc sig 一般来说 阻塞 高亮 min 复制
原文地址:https://www.cnblogs.com/LiuYanYGZ/p/14293309.html