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

📄 shmpool.c

📁 公关系统服务器后台程序
💻 C
字号:
#include <stdio.h>#include <stdlib.h>#include <string.h>#include <errno.h>#include <sys/types.h>#include <sys/ipc.h>#include <sys/shm.h>//数据池写接口集#include "shmpool.h"void* shmStartPos=NULL;//位置信息定义#define shmMaintainMacID	(short*)(shmStartPos)#define shmDataCount		(int*)(shmStartPos+4)#define shmDataCur		(int*)(shmStartPos+8)#define shmDataUsed		(int*)(shmStartPos+12)#define shmDataSize		(int*)(shmStartPos+16)#define shmMANAGE		(char*)(shmStartPos+20)#define shmMANAGETOTAL		(char*)(shmStartPos+180)#define nodeStartPos		(shmStartPos+182)poolErr shmQueryMIp(char *ipaddr,short ipPos){	memcpy(ipaddr,shmMANAGE+16*ipPos,16);	return poolSuccess;}poolErr shmWriteMIp(char *ipaddr){	char ipc=*shmMANAGETOTAL;	if(ipc==10)		return dataFailPara;	memcpy(shmMANAGE+16*(ipc-1),ipaddr,16);	*shmMANAGETOTAL=(ipc+1);	return poolSuccess;}short shmQueryMc(){	char ipc;	ipc=*shmMANAGETOTAL;	return (short)ipc;}poolErr shmPoolInit(short dataCount,short nodeSize){	int shmId;	int shmSize;	shmSize=dataCount*(nodeSize+1)+178;	shmId=shmget(0x1002,shmSize,IPC_CREAT|SHM_R|SHM_W);	if(shmId==-1)		return dataFailShmGet;	shmStartPos=shmat(shmId,0,0);		if(*shmDataCount==0)	{		*shmDataCount=dataCount;		*shmDataSize=nodeSize;		*shmDataCur=0;		*shmMaintainMacID=-1;		return poolSuccess;	}	else		return poolConnected;		}poolErr poolGetFirst(void *node){	*shmDataCur=0;	memcpy(node,nodeStartPos,*shmDataSize);	return poolSuccess;}	poolErr poolGetLast(void *node){	*shmDataCur=*shmDataCount-1;	memcpy(node,nodeStartPos+(*shmDataCur)*(*shmDataSize),*shmDataSize);	return poolSuccess;}poolErr poolGetNext(void *node){	if(*shmDataCur>=*shmDataCount)		return dataEOF;	memcpy(node,nodeStartPos+(*shmDataCur)*(*shmDataSize),*shmDataSize);	*shmDataCur=*shmDataCur+1;		return poolSuccess;}poolErr poolGetPrev(void *node){	if(*shmDataCur==0)		return dataEOF;	memcpy(node,nodeStartPos+(*shmDataCur)*(*shmDataSize),*shmDataSize);	*shmDataCur=*shmDataCur-1;	return poolSuccess;}short poolGetCount(){	return (short)*shmDataCount;}/*int poolGetCur(){	return (int)*shmDataCur;}*/short poolGetUsed(){	return (short)*shmDataUsed;}void poolSetUsed(short value){	*shmDataUsed=value;}/*void poolSetCur(int curPos){	*shmDataCur=curPos;}*/void poolMove(short pos){	if(pos>=(*shmDataCount))		return;	*shmDataCur=pos;}poolErr poolQueryNode(void *node,short nodePos){	void *sourceNode;	if(nodePos>(*shmDataCount-1))		return dataFailPara;	sourceNode=nodeStartPos+nodePos*(*shmDataSize);	memcpy(node,sourceNode,*shmDataSize);	return poolSuccess;}poolErr poolWriteNode(void *node,short nodePos){	void *destNode;	if(nodePos>*shmDataCount-1)		return dataFailPara;	destNode=nodeStartPos+nodePos*(*shmDataSize);	memcpy(destNode,node,*shmDataSize);	return poolSuccess;}short poolQueryNodeByMacID(short macid){	int i,count;	short *poolmacid=(short*)nodeStartPos;	count=*shmDataUsed;	for(i=0;i<count;i++)	{		poolmacid=nodeStartPos+i*(*shmDataSize);#if DEBUG		printf("poolmacid===%d,i=%d\n",*poolmacid,i);#endif		if(*poolmacid==macid)			return i;	}	return -1;}short poolSetMaintainMark(short macid){	int i,count;	short *poolmacid=(short*)nodeStartPos;	count=*shmDataCount;	if(macid==-1)	{		*shmMaintainMacID=-1;		return -1;	}		for(i=0;i<count;i++)	{		poolmacid=nodeStartPos+i*(*shmDataSize);#if DEBUG		printf("i==%d,poolmacid==%d\n",i,*poolmacid);#endif		if(*poolmacid==macid)		{			*shmMaintainMacID=macid;			return i;		}		else			continue;				}	return -1;}short poolGetMaintainMark(){	return *shmMaintainMacID;}poolErr poolDeleteNode(short macid){	int i,count,countused;		short *poolmacid=(short*)nodeStartPos;	void *sourceNode,*destNode;		count=*shmDataCount;	countused=*shmDataUsed;		for(i=0;i<countused;i++)	{		poolmacid=nodeStartPos+i*(*shmDataSize);		if(*poolmacid==macid)		{			for(;i<countused-1;i++)			{				destNode=nodeStartPos+i*(*shmDataSize);				sourceNode=nodeStartPos+(i+1)*(*shmDataSize);				memcpy(destNode,sourceNode,*shmDataSize);			}			memset(sourceNode,0,*shmDataSize);			*shmDataUsed=*shmDataUsed-1;			return poolSuccess;		}	}	return dataFailPara;}

⌨️ 快捷键说明

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