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。