Linux进程间通信之信号量
一、定义:信号量与已经介绍过的IPC机构(管道、FIFO以及消息队列)不同,它是一个计数器,用于为多个进程提供对共享数据对象的访问(共享资源)。
注:在计算机领域,共享资源(shared resource)或网络共享(network share)是指使同一个计算机网络上的其他计算机可使用的某台计算机的计算机资源的行为。换而言之,是使计算机上的一种设备或某些信息可通过另一台计算机以局域网或内部网进行远程访问,且过程透明,就像资源位于本地计算机一般。网络共享可能通过网络上的进程间通信实现。
二、特点
1.信号量用于进程间同步,若要在进程间传递数据需要结合共享内存。
2. 信号量基于操作系统的 PV 操作,程序对信号量的操作都是原子操作。
3. 每次对信号量的 PV 操作不仅限于对信号量值加 1 或减 1,而且可以加减任意正
整数。
4. 支持信号量组。
三、如何获得共享资源
为了获得共享资源,进程需要执行下列操作。
1.测试控制该资源的信号量。
2.若此信号量的值为正,则进程可以使用该资源。在这种情况下,进程会将信号值减1,表示它使用了一个资源单位。
3.否则,若此信号量的值为0,则进程进入休眠状态,直至信号值大于0.进程被唤醒后,它返回步骤(1)。
四、函数semget
NAME
semget - get a semaphore set identifier
SYNOPSIS
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
int semget(key_t key, int nsems, int semflg);
//返回值:若成功返回信号量集ID;若失败返回-1
①功能:创建或获取一个信号量组。
②参数:
*key:所创建或打开信号量集的键值。
*nsems:创建的信号量集中的信号量的个数,该参数只在创建信号量集时有效。
*semflg:调用函数的操作类型,也可用于设置信号量集的访问权限,两者通过or表示。
五、函数semop
NAME
semop, semtimedop - semaphore operations
SYNOPSIS
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
int semop(int semid, struct sembuf *sops, unsigned nsops);
//返回值:成功返回0,失败返回-1。
①功能&