linux信号量操作

2019-06-13  本文已影响0人  星q_p光

什么是信号量

用来保护公共资源,使得资源在一个时刻只能有一个进程使用。

信号量值为正的时候,说明他空闲;若为0,说明被占有,测试线程要进入睡眠队列中,等待被唤醒。

wait(S)S=S-1;如果S>=0,正常运行,S<0进入等待队列

singnal(S)S=S+1 S>0正常运行,如果S<=0,在等待队列中选择一个进程使其继续运行。

linux提供的两种信号量

1.内核信号量:由内核控制路径使用

2.用户态进程使用的信号量

1)POSIX信号量:分为有名信号量和无名信号量。有名信号量值保存在文件中,可以用于线程和进程间的同步。无名信号量保存在内存中用于线程同步。

引用的头文件:<semaphore.h>

2)system v信号量:一个或多个信号量的集合,对应的是一个信号量集体,常用于进程同步。

引用的头文件:<sys/sem.h>

linux 信号量集操作函数:

1.semget

int semget(key_t key,int nsems,int semflg)创建或打开一个已创建的信号量集,执行成功会返回信号量的ID否则返回-1

key:创建或打开的信号量集的键值,常用IPC_PRIVATE由系统分配。

nsems 新建信号量集中的信号量个数,通常为1。

semflg:对信号量集合进行打开或存取

            IPC_CREAT:创建

            IPC_EXCL:要和creat结合使用,要么创建一个新的集合,要么对已经存在的集合返回-1

2.semop

int semop(int semid,struct sembuf *sops,unsigned nsops) 对信号量集中的信号量进行指定的操作。借助sembuf增加或减少信号量的值,执行成功返回0,否则返回-1;

semid:信号量集的id

sops:数组类型

nsops:sops数组大小

3.semctl

int semctl(int semid,int semnum,int cmd);

semnum索引量的标识

cmd要执行的命令

sembuf

struct sembuf sem_b;

sem_b.sem_num = 0;//操作的信号量在信号量集中的索引值

sem_b.sem_op= -1;负数表示p操作,正数表示v操作

sem_b.sem_flg=SEM_UNDO;//操作标志,sem_undo

进程意外结束时恢复信号量的操作。

上一篇 下一篇

猜你喜欢

热点阅读