sem_open(3) | initialize and open a named semaphore |
sem_init(3) | initialize an unnamed semaphore |
sem_wait(3) | P 操作 |
sem_post(3) | V 操作 |
sem_close(3) | close a named semaphore |
sem_destroy(3) | destory an unnamed semaphore |
sem_unlink(3) | remove a named semaphore |
无名信号量可以用在共享内存的情况下,比如实现进程中各个线程之间的互斥和同步。命名信号量通常用于不共享内存的情况下,比如不共享内存的进程之间。
1、有名信号量的创建
1)创建并初始化
sem_t *sem_open(const char *name, int oflag); //打开已存在
sem_t *sem_open(const char *name, int oflag, mode_t mode, unsigned int value); //创建
name用于标识信号量的名字
oflag被设置为O_CREAT用来创建一个信号量(如果和0_EXCL一起,当这个信号量已经存在时候这个调用将会失败)
mode控制新的信号量的访问权限
value指定信号量的初始化值
2)int sem_wait(sem_t *sem);
锁住信号量,如果这个信号量的计数大于0,锁住这个信号量之后,信号量计数减一。如果这个信号量的计数是0,这个调用被阻塞。
解锁一个信号量的语义是:
3)int sem_post(sem_t *sem);
对信号量增1然后返回。
4)销毁信号量
在退出或是退出处理函数中调用sem_unlink()去删除系统中的信号量。在sem_unlink之前,要确保所有对这个有名信号量的引用都已经通过sem_close()关闭,否则,sem_unlink()函数不会起到任何的作用。
5)有名信号灯支持进程间通信。
2、无名信号量的创建
一个无名信号量被放置在一个被多个线程(多线程共享信号量)或是进程(多进程共享信号量)共享的内存区域。一个线程共享信号量被放置在一个只有同一个进程的线程共享它们的区域,例如一个全局的变量。一个进程共享的信号量被放置在一个不同进程可以共享它们的区域,例如一个共享内存区。一个无名信号量为线程间和相关的进程间提供同步机制。
1)无名信号量不需要使用sem_open调用,下面的两行代码替换了它的行为:
{
sem_t semid;
int sem_init(sem_t *sem, int pshared, unsigned value);
}
示例代码见[2]。
3、信号量是包含一个非负整型变量
参考
【1】
【2】
【3】
【4】
【5】 不错的文档
【6】