sem_open、sem_close、sem_unlink

来源:互联网 发布:淘宝达人好做吗 编辑:程序博客网 时间:2024/06/15 23:32

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);}



0 0
原创粉丝点击