嵌入式系统嵌入式系统/ARM技术中的技术中的Linux下信号灯的使用下信号灯的使用
作者:杨硕,华清远见嵌入式学院讲师。 一、信号灯简介: Linux支持系统5的信号灯(semaphore),
是一种进程间通信的方式,只不过它和管道、FIFO或者共享内存等不一样,信号灯主要用于同步或者互斥对共
享资源的访问,它的发明来源于火车运行系统中的“信号灯”,利用信号灯可以实现 “PV操作”这种进程间同步机
制。P操作是获得资源,将信号灯的值减1,如果结果不为负则执行完毕,进程获得资源,否则进程睡眠以等待
资源别的进程释放资源;V操作则是释放资源,给信号灯的值加1,释放一个因执行P操作而等待的进程。
二、信号灯的两种类型 1、二值信号灯: 最简单的信号灯形式,信号
作者:杨硕作者:杨硕,华清远见嵌入式学院讲师。
一、信号灯简介:
Linux支持系统5的信号灯(semaphore),是一种进程间通信的方式,只不过它和管道、FIFO或者共享内存等不一样,
信号灯主要用于同步或者互斥对共享资源的访问,它的发明来源于火车运行系统中的“信号灯”,利用信号灯可以实现 “PV操
作”这种进程间同步机制。P操作是获得资源,将信号灯的值减1,如果结果不为负则执行完毕,进程获得资源,否则进程睡眠
以等待资源别的进程释放资源;V操作则是释放资源,给信号灯的值加1,释放一个因执行P操作而等待的进程。
二、信号灯的两种类型
1、二值信号灯:
最简单的信号灯形式,信号灯的值只能取0或1,类似于互斥锁。
虽然二值信号灯能够实现互斥锁的功能,但两者的关注内容不同。信号灯强调共享资源,只要共享资源可用,其他进程同
样可以修改信号灯的值;互斥锁更强调进程,占用资源的进程使用完资源后,必须由进程本身来解锁。
2、 计数信号灯:
信号灯的值可以取任意非负值(当然受内核本身的约束),用来统计资源,其值就代表可用资源的个数。
三、Linux下对信号灯的操作
1、 打开或创建信号灯
对应的系统调用:
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
int semget(key_t key, int nsems, int sem*);
第一个参数key是一个键值,信号灯集的描述符就由系统范围内唯一的一个键值生成。
key可以由ftok函数生产:
#include <sys/types.h>
#include <sys/ipc.h>
key_t ftok(const char *pathname, int proj_id);
ftok返回与系统中的路径pathname相对应的一个键值
nsems是信号灯集中信号灯的个数,其最大值取决于具体的系统,如果是0,则代表访问已存在的信号灯集。
sem*是一些标志位,它是IPC_CREAT、IPC_EXCL、IPC_NOWAIT三者与访问权限或的结果,访问权限一般都是
0600,代表只有信号灯集的属主才对信号灯集有读写的权限。
semget()如果执行成功,返回与key对应的信号灯集描述字(非负整数,存在于内存之中),失败返回-1,并将错误码置
于errno全局变量中。
2、操作信号灯
linux可以增加或减小信号灯的值,相应于对共享资源的释放和占有。
对应的系统调用: