IPC之信号量

无名信号量

POSIX标准提出了有名信号量和无名信号量来同步进程和线程,而linux(2.6以前)只实现了无名信号量。

sem_overview中有详细介绍:man 7 sem_overview.

System V semaphores(semget, segop, etc.)是旧的信号量API,但应用广泛。 posix信号量简单易用。

  • Posix Sem
#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,唤醒所有阻塞线程。

  • System sem
#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; /*操作的标志*/    
};

你可能感兴趣的:(IPC之信号量)