1. 信号量设置
1.1概念
(1)什么是信号量?
信号量是用于控制同时访问资源的进程数并解决有限资源分配问题的计数器
(2)什么是信号量集?
信号量集是指信号量的集合,它是多个信号量的数组,可以同时控制多个资源的分配
1.2计数器的工作方式
(1)首先将计数器初始化为最大值
(2)如果有申请资源的流程,则计数将减少1
(3)计数器的值为0时,资源申请过程终止,资源申请过程被阻塞
(4)进程释放资源信号量集,并且计数增加1
(5)如果计数器的值大于0,则被阻塞的进程可以获得共享资源,直到计数为0,其他进程继续阻塞
1.3使用信号量集的通信过程
(1)获取密钥值,直接分配它或使用ftok函数生成它
(2)创建/获取信号量集,使用semget函数
(3)初始化信号量集,初始化指定的信号量,使用semctl函数
(4)操作信号量集,添加/减去指定的信号量,使用semop函数
(5)如果不再使用信号量集,则可以删除该信号量集并使用semctl函数
1.4功能分析
(1)semget函数
int semget(key_t键,int nsems,int semflg);
第一个参数: 特定的键值可通过ftok函数获取
第二个参数: 信号量集的大小信号量集,即信号量的数量
第三个参数: 信号量集IPC_CREAT的操作方法-如果不存在,则获取IPC_EXCL-如果存在,则创建-如果存在则失败-获取信号集,否则将失败
返回值: 成功返回信号量集的ID,如果失败则返回-1.
功能功能: 创建/获取信号量集
注意: 创建信号量集时,需要在第三个参数(2)semctl函数中指定该信号量集的权限
int semctl(int semid,int semnum,int cmd,...);
第一个参数: 信号量集的ID
第二个参数: 表示信号量集的下标
第三个参数: 指示特定操作SETVAL-设置信号量集中信号量信号量的值,该特定值集由arg确定. valIPC_STAT-将semid指定的信号量集信息复制到arg. buf中的IPC_SET-set信号量集IPC_RMID根据arg.buf中的内容为Semid指定-删除信号量集的第四个参数:
工会semun {int val; / *在第三个参数SETVAL * /
时使用
struct semid_ds * buf; / * IPC_STAT,IPC_SET * /无符号短* array; / * GETALL,SETALL * /
struct seminfo * __ buf; / * IPC_INFO * /}
struct semid_ds {
struct ipc_perm sem_perm; / *所有者和权限* /
time_t sem_otime; / *最后一次使用semop * /
time_t sem_ctime; / *最后更改时间* /
unsigned short sem_nsems; / *信号灯数量* /};
struct ipc_perm {
key_t __key; / *键值* /
uid_t uid; / *有效的用户ID * /
gid_t gid; / *有效的用户组ID * /
uid_t cuid; / *创建者的用户ID * /
gid_t cgid; / *创作者的组ID * /
无符号短模式; / *权限* /
无符号短__seq; / *序列号,无论如何* /}
返回值: 成功返回值根据cmd不同,失败返回-1
(3)演示功能
int semop(int semid,struct sembuf * sops,unsigned nsops);
第一个参数: 信号灯集的ID
第二个参数: 结构指针
无符号短sem_num; / *信号集中的下标* /
short sem_op; / *对于特定操作,正数增加而负数减少* /
short sem_flg; / *默认情况下,0表示阻止,而IPC_NOWAIT表示不阻止* /
第三个参数: 信号量集的大小
返回值: 0表示成功,-1表示失败
函数功能: 对Semid指向的信号集中的nsops信号执行特定操作
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-281256-1.html