Ò»¸ölinuxϹ²ÏíÄÚ´æµÄÓ¦ÓÃ
´ó¼ÒºÃ£ºÕâÊÇÒ»¸öÎÒÔÚ¹¤×÷ÖÐʹÓõĻùÓÚlinux¹²ÏíÄÚ´æµÄÀà¡£Éè¼ÆËüµÄÄ¿µÄÊÇΪÁËÔÚÁ½¸ö»ò¶à¸ö½ø³Ì¼äͬ²½»òÒì²½µÄ´«Êä½á¹¹»¯Êý¾Ý¡£
¸ÃÀàµÄʵÏÖÉæ¼°µ½ÒÔÏ ֪ʶµã£º¹²ÏíÄÚ´æ¡¢ÐźÅÁ¿¡¢ÐźźÍARMÉϵÄÄÚ´æ¶ÔÆë·½Ê½µÈ¡£k/ie [B
ÎÒÊÇÏë½è´Ë»ú»áÅ×שÒýÓñ£¬Ôںʹó¼Ò¹²Í¬Ñ§Ï°Ö®Ó࣬ҲϣÍû¸÷λÄܹ»²»Áß·¢±í¸ß¼û£¬ÌÖÂÛÒ»ÏÂÕâ¸öÀàµÄÓÅȱµãÒÔ¼°ÊµÏÖ½ø³Ì¼äͨПüºÃ¸ü¸ßЧµÄ·½·¨¡£vn%U/o Ip l
ÎÒµÄÁªÏµ·½Ê½ÊÇ [email=ljq1000@hotmail.com]ljq1000@hotmail.com[/email]£¬»¶Ó´ó¼ÒÓëÎÒÁªÏµ¡£ P1PX;uO ?;A$WA3E
[code]/*********************************************************************
Auther: Li Jieqian3fE;y;nHN&Ej"I+CX0Q
The MQShm class provides transporting structural data synchronously
between two process.2R,^ kzN%D Y-N
~\FHtHfK fQo!o
One of the process is called Data-Maker, the other called Data-Customer.
The functionaly of process is relative. gI@1S2G
;^7v:l?s]*zN
Usage in Data-Maker:C#F:` j1\p5zE
lock -> set status to busy -> fill data in shm -> set status to ready -> 7}-q*Wv.@x)dr#S
unlock -> wait status OK
Usage in Data-Customer:
wait status ready -> lock -> get data -> clear shm -> set status to OK#Lp~ }){hE
PW Wgx7[dW0ot
Note that: MQShm class use a unix share memory and two semphones. Hw phr+zV
Share memory is created with a KEY user defined, semphones is created $Pl~+[!C YA
with key KEY and KEY + 1.GS+`S$p
************************************************************************/lL)C7W`h.J
#ifndef MQSHM_H[6U$lH| Pj$|w
#define MQSHM_H-p3j Hro*K
MP!u"l+L b(z6H_"@b
#include <sys/ipc.h>
#include <sys/shm.h>9H},i^k9M
/p @0r$@y-T#I-Lg$H
typedef unsigned int uint;
typedef unsigned char uchar;
typedef unsigned short ushort;z+Uf}]%VZ#c
typedef unsigned short link_t;b'fV h@;Uic0p:[&e{c
const link_t ALIGN_MASK = 0x8000;
struct MQShmPriv;
Cv lt.zC~
class MQShm7yE'@Q3}8VsJ0@
{7kX2Sl0N?1c
public:
// shm status5sNv:}u4nM7I|a
enum {
StUnknown = 0, L)S!vI6CAwi
StOK = 1, $GZ\U7ON}S+k
StError = 2,
StBusy = 4,
StReady = 8'R,q#\LZ3qp
};
%^ ~ l7Zk6k*x
static const link_t null = (link_t) -1 & ~ALIGN_MASK;g KC5icu
@;IN5M3}]4W"n$W
private:)U} v @!R
int _shmId;
int _shmSemId;k8s1c/K{7\2W/k
int _pidSemId;
size_t _size;Q7n([/Ey!r
uchar *_shm;,`]HzY[^
MQShmPriv *_priv;
int _myPidIdx;vL#Yfs*P.Z
B](V%bWZ]
private:
void pidLock();
void pidUnlock();2VXGrj @
public:
MQShm(key_t key, size_t size, bool init = false);
virtual ~MQShm();
g.L_zHwJ m5i[p
void close();
&h-F9f9pn P8my:W8U
void lock(); N?1_1H7{;g"j p
void unlock();
bool locked();
/|m1De h$Z
uint freeSpace() const;