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

📄 hqueue.c

📁 实用、效率高的linux下消息队列程序,可以快速,方便的应用于linux线程间的通信
💻 C
字号:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "hqueue.h"

/***********************************************************/
HQUEUE * hqCreate(unsigned int unit_num,unsigned int unit_size,unsigned int queue_mode)
{
	HQUEUE *phq = (HQUEUE *)malloc(sizeof(HQUEUE));
	if(phq == NULL)
	{
		printf("hqCreate malloc HQUEUE fail\n");
		return IPANEL_NULL;
	}
	phq->queue_mode = queue_mode;
	phq->unit_size = unit_size;
	phq->unit_num = unit_num;
	phq->front = 0;
	phq->rear = 0;
	phq->count_put_full = 0;

	
  printf("[xiaohw:%s  %d] unit_num=%d  unit_size=%d queue_mode=%d\n", __FUNCTION__,__LINE__,unit_num,unit_size,queue_mode);
	if((sem_init((sem_t*)&phq->queue_nnulEvent, 0, 0)!=0 ) || (  sem_init((sem_t*)&phq->queue_nfulEvent, 0, unit_num)!=0))
	{
		free(phq);
	//	printf("hqCreate::queue_sem == NULL\n");
		return IPANEL_NULL;
	}

	phq->queue_buffer = (char *)malloc(unit_num * unit_size);
	if(phq->queue_buffer == NULL)
	{
		free(phq);
		printf("hqCreate malloc buffer fail\n");
		return IPANEL_NULL;
	}

	return phq;
}

void hqDelete(HQUEUE * phq)
{
	if(phq == NULL)return;
	
	if(phq->queue_buffer)
		free(phq->queue_buffer);
         // sem_destroy((sem_t*)&phq->queue_semMutex);
	  sem_destroy((sem_t*)&phq->queue_nnulEvent);
	  sem_destroy((sem_t*)&phq->queue_nfulEvent);
	

	free(phq);
}

/***********************************************************/
int hqBufPut(HQUEUE * phq,char * buf)
{
	unsigned int real_rear,queue_count;

hqBufPut_start:

	queue_count = phq->rear - phq->front;

	if(queue_count == (phq->unit_num - 1))
	{
	
		if(phq->queue_mode & HQ_PUT_WAIT){
			sem_wait( (&phq->queue_nfulEvent));
			goto hqBufPut_start;
		}
		else {
			phq->count_put_full++;	//队列满失败次数+1
			return IPANEL_ERR;
		}

//		return FALSE;
	}

	real_rear = phq->rear % phq->unit_num;
	memcpy(phq->queue_buffer + real_rear*phq->unit_size,buf,phq->unit_size);
	phq->rear++;



	sem_post(&phq->queue_nnulEvent);	//发送一个信号表示队列中又多一个成员(至少有非空)

	return IPANEL_OK;
}

int  hqBufGet(HQUEUE * phq,char * buf)
{
	unsigned int real_front;
	
  
hqBufGet_start:  


	if(phq->front == phq->rear)	//队列空
	{
		if(phq->queue_mode & HQ_GET_WAIT){
			sem_wait(&phq->queue_nnulEvent);//等待PUT函数发信

⌨️ 快捷键说明

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