Linux进程间通信——信号量&信号详解

一、信号量semaphore

1.1概念

        也称信号灯,信号量本质上是一个计数器(非负整数),主要用来保护临界资源(共享资源),这种资源同一时刻仅供一个进程(线程)使用,它的值表示系统中该资源的数量(若为0当然不允许使用),因此可以实现进程(线程)间的同步与互斥。对于共享内存,所有进程都可以访问,就容易导致读写冲突,此时就很需要信号量来配合使用。

同步在共享它的进程或线程间保持数据一致

互斥同一时刻仅供一个进程(线程)使用资源

信号量只能通过三种操作来访问:

  • 初始化

  • P操作(申请使用资源,属于"消费者")

    • 如果信号量>0,信号量-1返回;

    • 如果信号量==0,则睡眠等待直到信号量>0然后立即-1返回

  • V操作(释放资源,属于"生产者")

    • 无进程/线程等待时+1,

    • 有进程/线程等待资源时(说明信号量为0)则唤醒并让其返回

linux用户态进程提供三种信号量,POSIX有名信号量、POSIX无名信号量、SYSTEM V信号量。

        有名信号量的值保存在文件中(具体是保存在/dev/shm/目录下,使用时需要链接库),它既可以用于进程(包括不相关进程)也可以用于线程;

        无名信号量的值保存在内存中,Linux只支持线程同步。

除了创建和删除不同,PV操作对应的API都相同

1.2创建

#include <semaphore.h>
#include <pthread.h>

//创建有名信号量
sem_t *sem_open(char *name, int oflag, mode_t mode, unsigned int value)
    
@param: name     信号量文件名字,不要带路径,因为有默认存放的目录
    	oflag    常用O_CREAT
        mode     常用0666
    	value    信号量初始值(二值信号量为1,普通信号量表示资源数目)
    
@return: 成功返回信号量指针,失败返回SEM_FAILED with errno值

                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值