linux 信号量

目的:linux 信号量简单尝试


#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>

typedef int sem_t;

union semun{
	int   val;
	struct semid_ds *buf;
	unsigned short  *arry;
}arg;

sem_t CreateSem(key_t key,  int value)
{
	union semun sem;
	sem_t semid;
	sem.val = value;
	
	semid = semget(key, 1, IPC_CREAT|0660);
	if (semid == -1)
	{
		printf("create error!");
		return -1;
	}

	semctl(semid, 0, SETVAL, sem);   // 发出命令 建立value个初始值信号量

	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;
	sem.val = 0;
	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("./server.c",'a');
	
	if (key == -1)
	{
		printf("ftok error\n");
		return 0;
	}
	
	semid = CreateSem(key, 100);
	for (i = 0; i <= 3; i++)
	{
		Sem_P(semid);
		Sem_V(semid);
	}
	value = GetvalueSem(semid);

	printf("Value:%d\n", value);
	
	DestroySem(semid);
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值