操作信号量的函数如下:
#include <linux/semaphore.h>
void down(struct semaphore *sem);
int down_interruptible(struct semaphore *sem);
int down_killable(struct semaphore *sem);
int down_trylock(struct semaphore *sem);
int down_timeout(struct semaphore *sem, long jiffies);
void up(struct semaphore *sem);
down
已经不再推荐使用。
down_interruptible
可以被信号打断,因此需要检查返回值:只有返回0
,才表明成功获取了信号量。使用down_interruptible
例子如下:
if (down_interruptible(&sem)) return -ERESTARTSYS;
down_killable
只能被fatal
信号打断,这种信号通常用来终止进程,因此down_killable
用了保证用户进程可以被杀死,否则一旦有死锁进程,则只能重启系统。
down_trylock
是非阻塞版本的down
,也要检查返回值。举例如下:
if (file->f_flags & O_NONBLOCK) {
if (down_trylock(&iosem)) return -EAGAIN;
} else {
if (down_interruptible(&iosem)) return -ERESTARTSYS;
}
down_timeout
用来等待一段时间,中间也不能被信号打断。
up
用来释放信号量,不需要提供interrupt
版本。