UNP2 P180
sem_t *sem_open(const char *name, int oflag,..,/*mode_t mode,unsigned int value*/) :打开有名信号量
1.当打开一个一定存在的有名信号量时,ofalg设置为0.
int sem_close(sem_t *sem):关闭有名信号量
2.一个进程终止时,内核对其上仍打开的所有有名信号量自动执行关闭操作。不论进程是自愿还是非自愿终止。
3.关闭一个信号量并没有将他从系统中删除。POSIX 有名信号量是随内核持续的:即使当前没有进程打开着某个信号量,他的值仍保持。
int sem_unlink(const char *name):从系统中删除有名信号量
4.每个信号量有一个引用计数器记录打开的次数,当引用计数大于0时,name 就能从文件系统中删除,然而其信号量的析构(不同于将他的名字从文件系统中删除)却要等到最后一个sem_close发生时为止.
sem_t *sem;
int val;
if((sem=sem_open(SEM_NAME,OFLAG,MODE,SEM_VALUE))==SEM_FAILED)
{
perror("sem_open failed");
exit(EXIT_FAILURE);
}
if(-1==sem_close(sem))
{
perror("sem_close failed");
exit(EXIT_FAILURE);
}
if(-1==sem_getvalue(sem,&val)) //sem_close() 后sem_getvalue() 错误:segmentation fault
{
perror("sem_getvalue failed");
exit(EXIT_FAILURE);
}
sem_t *sem;
int val;
if((sem=sem_open(SEM_NAME,OFLAG,MODE,SEM_VALUE))==SEM_FAILED)
{
perror("sem_open failed");
exit(EXIT_FAILURE);
}
if(-1==sem_unlink(SEM_NAME))
{
perror("sem_unlink failed");
exit(EXIT_FAILURE);
}
if(-1==sem_getvalue(sem,&val)) //sem_unlink() 后sem_getvalue()可以获取到信号量的值(此时,name删除,信号量并未析构(上述第4))
{
perror("sem_getvalue failed");
exit(EXIT_FAILURE);
}
if(-1==sem_close(sem))
{
perror("sem_close failed");
exit(EXIT_FAILURE);
}