信号量的使用主要有以下接口可供调用:
1 sem_init
#include <semaphore.h>
int sem_init(sem_t *sem, int pshared, unsigned int value);
sem_init函数用于初始化一个未命名的信号量;
sem_t *sem:指向一个信号量结构的指针;
int pshared:用于指示信号量是进程内线程共享还是进程间共享;
unsigned int value:用于初始化信号量的值;
sem_wait和semtrywait函数错误说明:返回值:若sem_init成功则初始化
sem_t *sem所指向的信号量结构内容,若失败返回-1,并设置errno的值;
用法:
#include <semaphore.h>
sem_t sem;
memset(&sem, 0, sizeof(struct sem_t));
sem_init(&sem, 0, 1);
2 sem_wait
int sem_wait(sem_t *sem);
int sem_trywait(sem_t *sem);sem_wait函数用于锁住
sem_t *sem所指定的信号量,若信号量的值为0,则sem_wait函数不返回,直到获取这个信号量,或被中断返回。若信号量值大于0,则获取信号量返回。
sem_t *sem:指向需要获取的信号量结构指针;
返回值:
若sem_wait返回0表示函数调用成功,并且信号量被锁,若返回-1则表示函数调用失败,并且信号量状态不会发生改变;错误值设置到errno里;
功能:若信号量没有被锁,则锁住信号量,若信号量已经被锁则不改变信号量状态,返回-1;
参数:
sem_t *sem:指向需要获取的信号量结构指针;
返回值:
若sem_wait返回0表示函数调用成功,并且信号量被锁,若返回-1则表示函数调用失败,并且信号量状态不会发生改变;错误值设置到errno里;
用法:
#include <semaphore.h>
int iRet = -1;
sem_t sem;
memset(&sem, 0, sizeof(struct sem_t));
sem_init(&sem, 0, 1);
....
// 在一个进程中的线程中共享
iRet = sem_wait(&sem);// iRet = sem_trywait(&sem);if (0 == iRet){printf("lock successful\n");}else{printf("lock failed\n");}
-
[EAGAIN]
信号量已经被锁,这个错误只被sem_trywait函数返回
-
[EINVAL]
信号量指针非法,或指向的信号量已经被释放;
-
[ENOSYS]
- The functions sem_wait() and sem_trywait() are not supported by this implementation.
[EDEADLK]
-
死锁;
- A deadlock condition was detected. [EINTR] 被中断信号中断;
-
int sem_post(sem_t *sem);
参数:功能:释放信号量;
sem_t *sem:
指向信号量的指针;返回值:0:释放信号量成功;-1:释放信号量失败,设置errno值errno:EINVAL:信号量为空;
用法:
#include <semaphore.h>
int iRet = -1;
sem_t sem;
memset(&sem, 0, sizeof(struct sem_t));
sem_init(&sem, 0, 1);
....
// 在一个进程中的线程中共享
iRet = sem_wait(&sem);// iRet = sem_trywait(&sem);if (0 == iRet){printf("lock successful\n");}else{printf("lock failed\n");}// do some useful thing。。
。。
sem_post(&sem);
。。。