在学习信号量之前,我们要先了解一个同样可以实现进程间通信的方式------共享内存。
共享内存:多个进程的虚拟地址空间,映射到同一块物理内存。
实现:同样需要两个进程的实现。
a.c:共享内存的创建和输入值:

b.c:调用共享内存和打印内存中的值:

执行代码后,会发现一个很大的问题:打印端会一直循环打印,而不是输入端输入一个值,打印一个值,不输入就不打印;
这个时候就需要使用到今天的主角------信号量
信号量:特殊的变量,用来做同步、互斥,解决并发竞态问题;可进行加一减一操作,都是原子操作。
减一:p操作,代表获取资源,若信号量的值为0,无法减一,那么p阻塞。
加一:v操作,代表释放资源,信号量加一,不会阻塞。
临界资源:同时时刻只运行一个进程访问的资源
临界区:访问临界资源的代码段
信号量取值分为两种:
二值信号量:只取0,1
计数信号量:0,1,3,5.....
所有到底如何使用信号量,实现我们上面所说的需求呢??
原理:控制输入端信号量s1初始为1,控制输出端信号量s2初始为0;通过加一和减一操作来控制进程是否阻塞或运行。

代码要实现的函数接口:
sem_init();//初始化信号量
sem_p();//减一操作
sem_v();//加一操作
sem_destroy();//删除信号量(全部的)
接口代码实现:

更改后的a.c:

更改后的b.c:

初始信号量s1为1,s2为0,所以输入端正常执行p(s1),减为0,输出端堵塞;
只有当输入完成,执行v(s2) ,s2加一,此时输入端堵塞,输出端正常执行p(s2),减为0;
输出完成,执行v(s1),s1为1,s2为0,循环如此,就可以实现一写一读。
这就是信号量的全部内容,感谢您的观看!!