一个信号量操作的例子

代码:

#include<stdio.h>
#include<sys/sem.h>
#include<sys/ipc.h>
#include<errno.h>
#include<string.h>
typedef int sem_t;
union semun{
int val;
struct semid_ds *buf;
unsigned short *array;
}arg;






sem_t CreateSem(key_t key,int value)
{
	union semun sem;
	sem_t semid;
	sem.val=value;
	semid=semget(key,1,IPC_CREAT | 0777);
//	perror("error");
	if(-1==semid)
	{
//	perror("error");
	printf("create semaphore error\n");
	return -1;
	}
	semctl(semid,0,SETVAL,sem);
	return	semid;
}
int Sem_P(sem_t semid)
{
	struct sembuf sops={0,+1,IPC_NOWAIT};
	return (semop(semid,&sops,1));
}
int Sem_V(sem_t semid)
{
	struct sembuf sops={0,-1,IPC_NOWAIT};
	return (semop(semid,&sops,1));
}
int GetvalueSem(sem_t semid)
{
	union semun sem;
	return semctl(semid,0,GETVAL,sem);
}
void DestroySem(sem_t semid)
{
	union semun sem;
	sem.val=0;
	semctl(semid,0,IPC_RMID,sem);
}
int main(void)
{
	key_t key;
	int semid;
	char i;
	struct semid_ds buf;
	int value =0;
	key=ftok("ipc/sem/",'a');
	printf("key = %d",key);
	semid=CreateSem(key,100);
	for(i=0;i<=3;i++)
	{
	Sem_P(semid);
	Sem_V(semid);
	}
	value=GetvalueSem(semid);
	printf("sem value is:%d\n",value);
	DestroySem(semid);
	return 0;

}

运行:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值