⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sample.c

📁 pv操作 消费者与生产者 经典代码 用于UNIx linux平台
💻 C
字号:
#include <sys/types.h>#include <sys/ipc.h>
#include <sys/sem.h>#include <stdio.h>
#define KEY (key_t)	//后面自己使用两个随机的数值
#define KEY2 (key_t)
#define MAX_BUFFER_SIZE	10		//缓冲区最大缓冲个数
union semun {
	int val;
	struct semid_ds *buf;
	ushort *array;
};						//用于semctl函数的控制结构

typedef struct _tagShareBuffer{
	int buffer[MAX_BUFFER_SIZE];
	int writer;
	int reader;
}SHAREBUFFER;			//共享内存中的结构

int main(){	int	  shmid;		//共享内存id	char* shmPtr;		//指向共享内存首地址的指针
	
	SHAREBUFFER* pSharebuffer;	//共享内存结构体指针
	int product = 0;			//产品值,生产一件自加1
	
	int	semid;	//信号集id
	struct sembuf mutex,empty,full;  //三个信号量的控制变量
	
	int i;
	
	//
	//创建或打开一个键值为KEY的信号量集合,包含3个信号量,并返回一个信号量集合id
	//	
	if ((semid = semget(KEY,3,IPC_CREAT|0660)) == -1)
	{
		printf("semget error! \n");
		
		return -1;
	}

	/*********************************************************
	*	初始化信号量的初值
	*	第0个信号量用于互斥,初值为1
	*	第1个信号量用于生产者,初值为MAX_BUFFER_SIZE
	*	第2个信号量用于消费者,初值为0
	*	arg是用于给信号量赋值的一个中间过渡变量,不必理会
	*********************************************************/
	union semun arg[3];
	arg[0].val = 1;
	arg[1].val = MAX_BUFFER_SIZE;
	arg[2].val = 0;

	for(i=0;i<3;i++)
		semctl(semid,i,SETVAL,arg[i]);	//赋值语句,因为信号是核心对象,所以要使用特殊的系统调用赋值
	
	for(i=0;i<3;i++)
		printf("The semval(%d) = %d\n",i,semctl(semid,i,GETVAL,NULL));

	//**************************
	//创建或打开一个键值为KEY的共享内存块,并返回它的id
	//将KEY值加1,避免与信号量集的key相同
	if ((shmid = shmget(KEY+1,sizeof(SHAREBUFFER),IPC_CREAT)) < 0)	{		printf("shmget error!\n");		return -1;	}
	
	//
	//将共享内存映射到进程空间里,并返回共享内存首地址
	//	if((shmPtr = (char*)shmat(shmid,0,0)) == (void*)-1)	{		printf("shmat error!\n");		return -1;	}
	
	memset((void*)shmPtr,0,sizeof(SHAREBUFFER));	//将共享内存空间清0
	
	pSharebuffer = (SHAREBUFFER*)shmPtr;

	//
	//下面开始向ShareBuffer中生产产品
	//
	while(1)
	{
		empty.sem_num = 1;		//指操作哪个信号量
		empty.sem_op  = -1;		//要对信号量的值作减1操作
		empty.sem_flg = 0;		//控制标识符
		semop(semid,&empty,1);	//P(empty)
		
		pSharebuffer->buffer[pSharebuffer->writer] = product;
		
		for(i=0;i<3;i++)
			printf("The semval(%d) = %d\n",i,semctl(semid,i,GETVAL,NULL));
		
		printf("Produced the product into buffer[%d] = %d;\n",pSharebuffer->writer,product);
		
		product++;
		
		mutex.sem_num = 0;
		mutex.sem_op  = -1;
		mutex.sem_flg = 0;
		semop(semid,&mutex,1);	//P(mutex)
		
		pSharebuffer->writer = (pSharebuffer->writer + 1) % MAX_BUFFER_SIZE;
		
		mutex.sem_num = 0;
		mutex.sem_op  = 1;
		mutex.sem_flg = 0;
		semop(semid,&mutex,1);	//V(mutex)
		
		full.sem_num = 2;
		full.sem_op	= 1;
		full.sem_flg = 0;
		semop(semid,&full,1); //V(full)

		sleep(1); //调节一下生产速度^_^
	}

	return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -