11.3.2 信号量的使用
信号量的使用,总是和某种可用资源联系在一起的。
创建信号量时的value值,其实指定了对应资源的初始个数。
当申请该资源时,需要先调用sem_wait函数;
当发布该资源或使用完毕释放该资源时,则调用sem_post函数。
1.等待信号量
sem_wait函数用于等待信号量,它会将信号量的值减1,其接口定义如下:
int sem_wait(sem_t *sem);
如果调用sem_wait函数时,信号量的当前值大于0,那么sem_wait函数立刻返回。
否则sem_wait函数陷入阻塞,待信号量的值大于0之后,再执行减1操作,然后成功返回。
如果陷入阻塞的sem_wait函数被信号中断,则返回-1,并且置errno为EINTR。
使用sigaction注册信号处理函数时,无论是否使用了SA_RESTART标志位,都不会自动重启系统调用。
如果仅仅是尝试等待信号量,而不想陷入阻塞,则可以调用sem_trywait函数,其接口定义如下:
int sem_trywait(sem_t *sem);
sem_trywait会尝试将信号量的值减1,如果信号量的值大于0,那么该函数将信号量的值减1之后会立刻返回。
如果信号量的当前值为0,那么sem_trywait也不会陷入阻塞,而是立刻返回失败,并置errno为EAGAIN。
若资源当前不可得,那么sem_wait调用就可能会陷入无限期阻塞,而sem_trywait调用则选择立刻返回失败,绝不阻塞。

本文详细介绍了Linux信号量的使用,包括等待信号量、发布信号量和获取信号量值的操作。信号量作为资源管理工具,通过sem_wait、sem_post和sem_getvalue等函数进行操作。sem_wait用于申请资源,可能阻塞;sem_post表示资源释放;sem_getvalue返回信号量的当前值,但可能已过时。
最低0.47元/天 解锁文章
910

被折叠的 条评论
为什么被折叠?



