无名信号量
POSIX标准提出了有名信号量和无名信号量来同步进程和线程,而linux(2.6以前)只实现了无名信号量。
sem_overview中有详细介绍:man 7 sem_overview.
System V semaphores(semget, segop, etc.)是旧的信号量API,但应用广泛。 posix信号量简单易用。
#include <semaphore.h>
int sem_init(sem_t *sem, int pshared, unsigned int value);
int sem_destroy(sem_t *sem);
int sem_wait(sem_t *sem);
int sem_trywait(sem_t *sem);
int sem_post(sem_t *sem);
int sem_getvalue(sem_t *sem);
pshared决定了信号量是否在几个进程间共享,由于linux还没有实现进程间共享信号灯,所以pshared只能取0.
编译上面几个函数程序要加上-lrt选项,以连接the real-time library, librt.so库。
加锁步骤:值大于0,值减1,锁成功;值小于等于0,则锁不成功阻塞。
解锁步骤:值加1,唤醒所有阻塞线程。
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
key_t ftok(char *pathname, char proj);
int semget(key_t key, int nsems, int semflg);
int semctl(int semid, int semnum, int cmd, union semun arg);
int semop(int semid, struct sembuf *spos, int nspos);
struct sembuf{
short sem_num; /*使用哪一个信号*/
short sem_op; /*进行什么操作*/
short sem_flg; /*操作的标志*/
};