手机操作系统 2016-10-08
#include<semaphore.h> #include<sys/stat.h> #include<fcntl.h>
//创建/打开一个有名信号量,成功返回新信号量的地址,失败返回SEM_FAILED设errno // <semaphore.h> //#define SEM_FAILED ((sem_t *) 0 //#define SEM_VALUE_MAX (2147483647) //Link with -pthread. sem_t *sem_open(const char *name, int oflag); sem_t *sem_open(const char *name, int oflag, mode_t mode, unsigned int value);
oflag
value :配合O_CREAT使用,设置信号量的初始值
//初始化无名信号量,成功返回0,失败返回-1设errno //Link with -pthread. int sem_init(sem_t *sem, int pshared, unsigned int value);
sem 创建无名信号量的指针 pthread指定信号量是在线程间使用还是进程间使用
//Link with -pthread. //成功返回降低后的信号量的值,失败返回-1设errno //试图占用信号量,如果信号量值>0,就-1,如果已经=0,就block,直到>0 int sem_wait(sem_t *sem); //试图占用信号量,如果信号量已经=0,立即报错 int sem_trywait(sem_t *sem); //试图占用信号量 //如果信号量=0,就block abs_timeout那么久,从 Epoch, 1970-01-01 00:00:00 +0000 (UTC).开始按纳秒计 //如果时间到了信号量还没>0,报错 int sem_timedwait(sem_t *sem, const struct timespec *abs_timeout);
struct timespec { time_t tv_sec; /* Seconds */ long tv_nsec; /* Nanoseconds [0 .. 999999999] */ };
//归还信号量,成功返回0,失败返回-1设errno //Link with -pthread. int sem_post(sem_t *sem);
//获得信号量sem的当前的值,放到sval中。如果有线程正在block这个信号量,sval可能返回两个值,0或“-正在block的线程的数目”,Linux返回0 //成功返回0,失败返回-1设errno //Link with -pthread. int sem_getvalue(sem_t *sem, int *sval);
//关闭有名信号量,成功返回0,失败返回-1设errno //Link with -pthread. int sem_close(sem_t *sem);
//试图销毁信号量,一旦所有占用该信号量的进程都关闭了该信号量,那么就会销毁这个信号量 //成功返回0,失败返回-1设errno //Link with -pthread. int sem_unlink(const char *name);
//销毁信号量,成功返回0,失败返回-1设errno //Link with -pthread. int sem_destroy(sem_t *sem);