博客首页 注册 建议与交流 排行榜 加入友情链接
推荐 投诉 搜索: 帮助

轮子的轨迹

── 技术版
  lunziyu.cublog.cn

关于作者
姓名:轮子
职业:硕士在读
年龄:26
位置:中科院计算技术研究所
个性介绍:对嵌入式软件、操作系统内核、驱动和移动通信技术感兴趣。
Email:lunziyu@gmail.com

|| << >> ||
我的分类


获取信号量的三种方式

void down(struct semaphore * sem);

该函数用于获得信号量sem,它会导致睡眠,因此不能在中断上下文(包括IRQ上下文和softirq上下文)使用该函数。该函数将把sem的值减1,如果信号量sem的值非负,就直接返回,否则调用者将被挂起,直到别的任务释放该信号量才能继续运行。

int down_interruptible(struct semaphore * sem);

该函数功能与down类似,不同之处为,down不会被信号(signal)打断,但down_interruptible能被信号打断,因此该函数有返回值来区分是正常返回还是被信号中断,如果返回0,表示获得信号量正常返回,如果被信号打断,返回-EINTR。

int down_trylock(struct semaphore * sem);

该函数试着获得信号量sem,如果能够立刻获得,它就获得该信号量并返回0,否则,表示不能获得信号量sem,返回值为非0值。因此,它不会导致调用者睡眠,可以在中断上下文使用。

void up(struct semaphore * sem);

该函数释放信号量sem,即把sem的值加1,如果sem的值为非正数,表明有任务等待该信号量,因此唤醒这些等待者。

发表于: 2008-03-15,修改于: 2008-03-15 11:57,已浏览287次,有评论0条 推荐 投诉


网友评论
 发表评论