Linux POSIX IPC 有名信号量 无名信号量

taianxiaojia 2016-10-08

Linux POSIX IPC 有名信号量 无名信号量

模型:

  1. 初始化并打开有名信号量:sem_open()
  • 创建/获得无名信号量:sem_init()
  • 操作信号量:sem_wait()/sem_trywait()/sem_timedwait()/sem_post()/sem_getvalue()
  • 退出有名信号量:sem_close()
  • 销毁有名信号量:sem_unlink()
  • 销毁无名信号量:sem_destroy()

头文件

#include<semaphore.h>
#include<sys/stat.h>
#include<fcntl.h>

sem_open()

//创建/打开一个有名信号量,成功返回新信号量的地址,失败返回SEM_FAILED设errno
// <semaphore.h>
//#define SEM_FAILED    ((sem_t *) 0
//#define SEM_VALUE_MAX     (2147483647)
//Link with -pthread.
sem_t *sem_open(const char *name, int oflag);
sem_t *sem_open(const char *name, int oflag, mode_t mode, unsigned int value);

oflag

  • O_CREAT如果信号量不存在就创建信号量,信号量的UID被设为调用进程的effective UID,GID被设为调用程序的GID,可以在mode指定权限
  • O_EXCL和O_CREAT连用,确保可以创建新的信号量,如果已存在就报错

value :配合O_CREAT使用,设置信号量的初始值

sem_init()

//初始化无名信号量,成功返回0,失败返回-1设errno
//Link with -pthread.
int sem_init(sem_t *sem, int pshared, unsigned int value);

sem 创建无名信号量的指针
pthread指定信号量是在线程间使用还是进程间使用

  • 0表示信号量在一个进程内的线程间使用,此时信号量应该分配的在线程可见的内存区域(eg,全局区,BSS段,堆区)
  • 非0表示信号量在进程间使用,此时信号量应该分配在共享内存里,If pshared !=0,

sem_wait()/sem_trywait()/sem_timedwait()

相关推荐