共享内存问题 急!!!!

lovestl 2004-12-23 06:20:39
。H文件:
/*内部消息*/
struct CMsg
{
int nMsgTo; /*消息目的结点*/
int nMsgFrom; /*消息源结点*/
unsigned char nSize; /*消息体大小*/
char szData[MAX_PACKET_SIZE]; /*消息体*/

CMsg& operator=(const CMsg &stMsg)
{
nMsgTo = stMsg.nMsgTo;
nMsgFrom = stMsg.nMsgFrom;
nSize = stMsg.nSize;
memcpy(szData, stMsg.szData, nSize);
return *this;
}
};


/***********************************
共享内存类
***********************************/
class CShm
{
public:
CShm(int nKey, int nSize);
~CShm();

void GetShm();
void AttachShm();
void DetachShm();
void RemoveShm();
void InitShm();
char* GetData(){return m_pData;}
protected:
int m_nKey;
int m_nSize;
int m_nShmID;
char* m_pData;
bool m_bCreate;
};

/***********************************
信号量类
***********************************/
#if defined(__GNU_LIBRARY__) && !defined(_SEM_SEMUN_UNDEFINED)
/* union semun is defined by including <sys/sem.h> */
#else
/* according to X/OPEN we have to define it ourselves */
union semun {
int val; /* value for SETVAL */
struct semid_ds *buf; /* buffer for IPC_STAT, IPC_SET */
unsigned short int *array; /* array for GETALL, SETALL */
struct seminfo *__buf; /* buffer for IPC_INFO */
};
#endif
class CSem
{
public:
CSem(int nKey, int nCount = 1);
~CSem();

bool Lock(int nIndex);
bool Unlock(int nIndex);
void GetSem();
void RemoveSem();
void InitSem();
void SetValue(int nSemNum, int nValue);
int GetValue(int nSemNum);
protected:
int m_nKey;
int m_nSemCount;
int m_nSemID;
bool m_bCreate;
};

/*自定义消息队列*/
struct CQueueShm
{
int nCount;
int nStackTop;
int nIdx[MAX_QUEUE_ITEM];
int nStack[MAX_QUEUE_ITEM];
CMsg stItems[MAX_QUEUE_ITEM];

CMsg& operator[](int nIndex)
{
return stItems[nIdx[nIndex]];
}
};

class CMyMsgQueue : public CShm
{
public:
CMyMsgQueue(int nKey, int nSemKey);
~CMyMsgQueue();
public:
bool Write(CMemoryStream &Stream, int nMaxRepeate = 60);
bool Read(CMemoryStream &Stream, int nSize, int nMsgType = 0);
inline int GetCount(){return m_pShm->nCount;}
void Clear();
void Lock();
void UnLock();
void GetMsgQueue(){}
private:
int GetCmdByIndex(int nIndex);
int FindCmd(int nCmd);
bool InterWrite(CMemoryStream &Stream);
int FindPos(int nCmd, int &nState);
void InitSlot();
int AllocSlot();
void FreeSlot(int nIndex);
private:
CQueueShm *m_pShm;
CSem m_MsgSem;
};


...全文
127 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
gettext 2004-12-24
  • 打赏
  • 举报
回复
bug
xfzhao_cn 2004-12-23
  • 打赏
  • 举报
回复
gdb
lovestl 2004-12-23
  • 打赏
  • 举报
回复
这个自定义队列用于进程间的通讯但不知为什么会数据会乱掉。
CMyMsgQueue m_SendQueue(KEY_SEND_MSG, KEY_SEND_SEM);
CMyMsgQueue m_RecvQeueu(KEY_SEND_MSG, KEY_SEND_SEM);
队列于主进程中创建,并调用Clear进行初始化了。

我所用的操作系统为SUN 5。9 编译器G++,那么高人给个答案谢谢。
lovestl 2004-12-23
  • 打赏
  • 举报
回复
BT,下面的怎么发不了

23,120

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧