sem_open、sem_close、sem_unlink

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





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值