【UNIX】Posix信号量

sem

信号量sem除了可以像互斥锁那样使用外,还有一个互斥锁没有提供的特性:互斥锁必须总是由锁住它的线程解锁,信号量的挂出却不必由执行过它的等待操作的同一线程执行

从此篇文章以及《UINX网络编程中》总结

有名信号量

sem_open

创建一个新的有名信号量或打开一个已存在的有名信号量

#include <fcntl.h>        
#include <sys/stat.h>      
#include <semaphore.h>
 
sem_t *sem_open(const char *name, int oflag);
sem_t *sem_open(const char *name, int oflag,mode_t mode, unsigned int value);

name 有名信号量名字
oflag 0、O_CREAT或O_CREAT|O_EXCL
mode 指定权限位(指定O_CREAT时才需要)
value 指定信号量的初值(指定O_CREAT时才需要)
return 若成功则为指向信号量的指针,若出错则为SEM_FAILED

sem_close

关闭由sem_open()打开的有名信号量

#include <semaphore.h>
 
int sem_close(sem_t *sem);

sem 要关闭的有名信号量
return 若成功则为0,若出错则为-1

sem_unlink

从系统中删除有名信号量

#include <semaphore.h>
 
int sem_unlink(const char *name);

name 有名信号量名字
return 若成功则为0,若出错则为-1.

sem_wait sem_trywait

sem_wait 等待信号量,如果该值大于0,那就将它减1并立即返回。如果该值等于0,调用线程就被投入睡眠,直到该值变为大于0,此时再将它减1,函数随后返回

sem_trywait 当所指定信号量为0时,不将调用线程投入睡眠。而是返回一个EAGAIN错误

#include <semaphore.h>
 
int sem_wait(sem_t *sem);
int sem_trywait(sem_t *sem);

sem 等待的信号量。
return 若成功则为0,若出错则为-1

sem_post

把所指定的信号量加1,然后唤醒正在等待该信号量变为正数的任意线程

#include <semaphore.h>
 
int sem_post(sem_t *sem);

sem 等待的信号量。
return 若成功则为0,若出错则为-1

sem_getvalue

在由valp指向的整数中返回所指定信号量的当前值

#include <semaphore.h>
 
int sem_getvalue(sem_t *sem, int *valp);

sem 等待的信号量
valp 保存所指定信号量的当前值。如果该信号量当前已上锁,那么返回或为0, 或为某个负数(其决定值就是等待该信号量解锁的线程数)
return 若成功则为0,若出错则为-1。

无名信号量

sem_init sem_destroy

无名信号量的初始化与销毁

#include <semaphore.h>
 
int sem_init(sem_t *sem, int pshared, unsigned int value);
int sem_destroy(sem_t *sem);

sem 要初始化的内存信号量。
shared 如果为0,那么待初始化的信号量是在同一进程的各个线程间共享的,否则该信号量是在进程间共享的。
注:当shared为非0时,该信号量必须存放在某种类型的共享内存中,而即将使用它的所有进程都要能访问该共享内存区。
value 信号量的初始值。
return 若出错则为-1。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值