11.3.1 创建、打开、关闭和删除有名信号量
创建或打开有名信号量,需要调用sem_open函数,其接口定义如下:
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和O_EXCL标志位。
如果带了O_CREAT标志位,则表示要创建信号量。
mode表示创建的新信号量的访问权限,标志位和open函数一样,mode参数的值也会根据进程的umask来取掩码。
value是新建信号量的初始值。
创建和赋初值都是由一个接口来完成的,这样就不会出现SystemV信号量可能出现的初始化竞争的问题了。
value的值在最小值0和最大值SEM_VALUE_MAX之间。
SUSv3要求最大值至少等于32767,对于Linux而言,这个限制为INT_MAX(在Linux/x86平台上,该值是2147483647)。
当sem_open函数失败时,返回SEM_FAILED,并且设置errno。
注意,不要尝试创建sem_t结构体的副本,下面这段代码的做法是错误的:
sem_t *sem_p,sem_dup;
sem_p = sem_open(… );
sem_dup = *sem_p;
/*非法操作 */
sem_wait(&sem_dup);
上面定义了sem_p的副本sem_dup,但在副本上执行sem的相关操作,行为是不可预知的