semaphore
使用头函数:semaphore.h
函数 | 解释 |
---|---|
int sem_init(sem_t *sem,int pshared,int valuse) | 创建信号量,value为初始值,pshared为最多多少个进程共享 |
int sem_destroy(sem_t *sem) | 销毁信号量 |
int sem_wait(sem_t *sem) | 阻塞进程直到sem>0,返回时信号量自动value-1 |
int sem_trywait(sem_t *sem) | 不阻塞进程,等待信号量为0时返回EAGAIN,表示重试 |
int sem_getvalue(sem_t *sem) | 获得sem的值 |
int sem_post(sem_t *sem) | 将信号量值+1并唤醒等待的进程 |
编译时候加上-lrt表示连接librt.so库
system V
使用头函数:sys/ipc.h&&sys/sem.h
函数 | 解释 |
---|---|
key_t ftok(char *pathname,char proj) | 根据pathname和proj创建关键字,也可以是IPC_PRIVATE的系统关键字 |
int semget(key_t key,int nsems,int semflg) | 设置信号量,nsems为信号量的个数,semflg时权限标志(同文件的权限的标志) |
int semctl(int semid,int semnum,int cmd,union semun arg) | 对sem的一系列控制,semid是操作的信号,semnum是信号个数,cmd是操作命令,常用的(SETVAL(设置信号量值),IPC_RMID(删除信号量))arg是cmd的参数 |
int semop(int semid,struct sembuf *spos,int nspos) | 对sem操作,spos是操作的数组,表面要进行什么操作,npos是数组个数 |
struct sembuf{
short sem_id;
short sem_op;//什么操作
short sem_flg;//操作标志
}
/*sem_op>0 sem_op加入信号量中,并唤醒等待信号增加的进程
sem_op=0 函数返回,否则阻塞直到值为0
sem_op <0 函数判断value=pro_value(进程的信号量)+sem_op;value=0,唤醒等待量为0的进程,<0,阻塞,>0,返回。