自学内容网 自学内容网

进程间的通信-信号量

信号量

1.资源竞争

  • 资源竞争 : 当多个进程同时访问共享资源时,会产生资源竞争,最终最导致数据混乱
  • 临界资源 : 不允许同时有多个进程访问的资源,包括硬件资源(CPU、内存、存储器以及其他外围设备)与软件资源(共享代码段、共享数据结构)
  • 临界区 : 访问临界资源代码
    在这里插入图片描述

2.同步与互斥

  • 互斥 : 同一时刻只有一个进程访问临界资源
  • 同步 : 在互斥的基础上增加了进程对临界资源的访问顺序
  • 进程主要的同步与互斥手段是信号量

3.信号量简介

信号量的起源来自于信号灯
在这里插入图片描述

  • 信号量: 由内核维护的整数,其值被限制为大于或等于0

  • 信号量可以执行如下操作:

     1.将信号量设置成一个具体的值
     2.在信号量当前值的基础上加上一个数值
     3.在信号量当前值的基础上减上一个数值
     4.等待信号量的值为 01.
    
  • 一般信号量分为二值信号量与计数信号量

1.二值信号量:一般指的是信号量的值为1,可以理解为只对应一个资源
2.计数信号量:一般指的是值大于等于2 ,可以理解为对应多个资源
  • 在 Linux 系统中查询信号量使用ipcs -s
    在这里插入图片描述

在这里插入图片描述

4.创建信号量

创建信号量集合调用semget函数

1.函数原型
int semget(key_t key, int nsems, int semflg);
2.函数头文件
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
2.函数功能
创建一个信号量集合
3.函数参数
key:ftok()函数生成
nsems:信号量的数量
semflg:信号量集合的标志
IPC_CREAT:创建标志
IPC_EXCL:与IPC_CREAT标志一起使用,如果信号量集合存在就报错
权限标志
4.函数返回值
成功:返回信号量集合的id
失败:-1,并设置errno

5.初始化信号量

初始化信号量调用 semctl 函数

函数头文件
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
函数原型
int semctl(int semid, int semnum, int cmd,);
函数功能
信号量集合控制函数,根据cmd决定当前函数的功能
函数参数
semid:信号量集合的id
semnum:信号量的编号,信号量的编号从0开始
cmd:命令控制字
SETVAL: 设置信号量的值(Set the semaphore value (semval) to arg.val for
the semnum-th semaphore of the set, updating also the sem_ctime member of the
semid_ds structure associated with the set.)
[将信号量值(semval)设置为该集合的第semnum个信号量的arg.val,同时更新与该集合相关联
的semid_ds结构的sem_ctime成员。]
GETVAL: 获取信号量的值
SETALL: Set the semval values for all semaphores of the set using
arg.array,
......
...:后面是属于可变参数列表,根据不同的命令有不同的参数
函数返回值
成功:根据不同的命令有不同的返回值,可以查看帮助文档关于 RETURN 的说明
GETNCNT the value of semncnt
GETPID the value of sempid
GETVAL the value of semval
GETZCNT the value of semzcnt.
All other cmd values return 0 on success.
失败:返回-1,并设置 errno

使用命令时需要使用 union semun 共用体,具体定义如下:

union semun {
int val; /* Value for SETVAL *///用的最多
struct semid_ds *buf; /* Buffer for IPC_STAT, IPC_SET */
unsigned short *array; /* Array for GETALL, SETALL *///用的最多
struct seminfo *__buf; /* Buffer for IPC_INFO
(Linux-specific) */
};
The semid_ds data structure is defined in <sys/sem.h> as follows:
struct semid_ds {
struct ipc_perm sem_perm; /* Ownership and permissions */
time_t sem_otime; /* Last semop time */
time_t sem_ctime; /* Creation time/time of last
modification via semctl() */
unsigned long sem_nsems; /* No. of semaphores in set */
};

原文地址:https://blog.csdn.net/m0_54244065/article/details/142395718

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!