linux sem 多进程sem_open sem_init,信号灯-布布扣-bubuko.com

概念:

信号灯用来实现同步——用于多线程,多进程之间同步共享资源(临界资源)。信号灯分两种,一种是有名信号灯,一种是基于内存的信号灯。

有名信号灯,是根据外部名字标识,通常指代文件系统中的某个文件。

基于内存的信号灯,它主要是把信号灯放入内存的,基于内存的信号灯,同步多线程时,可以放到该多线程所属进程空间里;如果是同步多进程,那就需要把信号灯放入到共享内存中(方便多个进程访问)。

有名信号灯和基于内存的信号灯,具体区别体现在创建和销毁两个函数。有名信号灯使用sem_open和sem_close函数。基于内存的信号灯使用sem_init和sem_destroy函数。sem_init的参数可以控制是同步多线程,还是多进程;且该函数只能调用1次,因为调用后信号灯就存在了( 内存指针存在)。一般,使用基于内存的信号灯同步同进程多线程,使用有名信号灯同步多进程。

有名信号灯同步多线程:

1.sem_open函数。

功能:创建并初始化信号灯,如果存在就返回存在的信号灯。

头文件:#include函数原型:sem_t* sem_open(const char * name,int oflag,mode_t mode,unsigned intvalue);

或者:sem_t* sem_open(const char * name,intoflag);

参数:name是给信号灯指定一个名字。oflag的值为O_CREAT,表示如果信号灯不存在,创建信号灯;为O_CREAT|O_EXCL,如果信号灯不存在报错。后面两个参数,只有新建信号灯时使用。mode为信号灯的权限(0644),value为信号灯的值。

返回值:成功时,返回信号灯的指针,错误返回SEM_FAILED2.sem_close函数。

功能:关闭引用信号灯,信号灯引用计数减1。

头文件:#include函数原型:int sem_close(sem_t *sem)

参数:sem为信号灯的指针

返回值:成功时,返回0,失败,-1注:每个信号灯有一个引用计数器记录当前打开次数.关闭一个信号灯并没有将它从系统中删除,而是信号灯引用计数减13.sem_unlink函数

功能:信号灯引用计数为0时,从系统中删除信号灯。

头文件:#include函数原型:int sem_close(const char *name)

参数:name为信号灯的外部名字

返回值:成功时,返回0,失败,-1

4.sem_wait/sem_trywait函数

功能:等待共享资源,信号灯值为0就睡眠,信号灯值大于0,就使用共享资源,信号灯值减1。sem_trywait当信号灯值为0时,不睡眠,报错。

头文件:#include函数原型:int sem_w

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值