/*************************************************************************** rc_mond shared memory template header ----------------------------------------- begin : 2015/06/15 copyright : (C) 2005 Solbox Inc. author : Storage Dev Team email : huibong@solbox.com version : 3.5 CopyRight(C) 2005 Solbox Inc. All Rights reserved. Redistribution and use in source and binary forms, with or with out modification, are not permitted in outside of Solbox Inc. ***************************************************************************/ // º» ÄÚµå´Â ½Ã½ºÅÛ °øÀ¯¸Þ¸ð¸® »ý¼º, Á¢±Ù, ÇØÁ¦, »èÁ¦ 󸮸¦ ¼öÇàÇϱâ À§ÇÑ ÄÚµå·Î¼­ // template ÄÚµå ¹æ½ÄÀ¸·Î ±¸¼º #ifndef __SHM_CONTROL_H__ #define __SHM_CONTROL_H__ #include #include #include /*----------- MODE Flag --------------- SHM_R 0400 read by user SHM_W 0200 write by user SHM_R >> 3 0040 read by group SHM_W >> 3 0020 write by group SHM_R >> 6 0004 read by others SHM_W >> 6 0002 write by others -------------------------------------*/ //////////////////////////////////////////////////////////////////////////////////////////////// /// @brief ShmControl °øÀ¯¸Þ¸ð¸® °ü·Ã Template Class template class CShmControl { public: /// @brief »ý¼ºÀÚ CShmControl(); /// @brief ¼Ò¸êÀÚ ~CShmControl(); /// @brief °øÀ¯¸Þ¸ð¸® »ý¼º, Á¢±Ù ¶Ç´Â ±âÁ¸ °øÀ¯¸Þ¸ð¸® Á¢±Ù. /// @param iShmKey °øÀ¯¸Þ¸ð¸® Á¢±ÙÀ» À§ÇÑ Å° /// @param iSize Á¢±ÙÇϰíÀÚ ÇÏ´Â °øÀ¯¸Þ¸ð¸®ÀÇ Å©±â /// @param iSize °øÀ¯¸Þ¸ð¸® »ý¼º¹× Á¢±Ù½Ã ±ÇÇÑ /// @return return true or false bool Create( key_t iShmKey, size_t iSize, int iModeFlag = SHM_R | SHM_W ); /// @brief ±âÁ¸ °øÀ¯¸Þ¸ð¸® Á¢±Ù. /// @param iShmKey °øÀ¯¸Þ¸ð¸® Á¢±ÙÀ» À§ÇÑ Å° /// @param iSize Á¢±ÙÇϰíÀÚ ÇÏ´Â °øÀ¯¸Þ¸ð¸®ÀÇ Å©±â /// @param iSize °øÀ¯¸Þ¸ð¸® Á¢±Ù½Ã ±ÇÇÑ /// @return return true or false bool Attach( key_t iShmKey, size_t iSize, int iModeFlag = SHM_R | SHM_W ); /// @brief ±âÁ¸ Á¢±ÙÇÑ °øÀ¯¸Þ¸ð¸®¿ÍÀÇ ¿¬°áÀ» ÇØÁ¦ /// @return return true or false bool Detach( void ); /// @brief ±âÁ¸ Á¢±ÙÇÑ °øÀ¯¸Þ¸ð¸®¿ÍÀÇ ¿¬°áÀ» ÇØÁ¦ ¹× »èÁ¦ /// @return return true or false bool Remove( void ); /// @brief °øÀ¯¸Þ¸ð¸®¿¡ ´ëÇÑ Æ÷ÀÎÅ͸¦ ¹Ýȯ /// @return »ý¼º ¹× Á¢±ÙÇÑ °øÀ¯¸Þ¸ð¸®¿¡ ´ëÇÑ Æ÷ÀÎÅÍ ¶Ç´Â ¿À·ù ¹ß»ý½Ã NULL T * GetShmPtr(void) const { return m_pShm; } /// @brief Á¢±ÙÇÑ °øÀ¯¸Þ¸ð¸®ÀÇ ID °ªÀ» ¹Ýȯ /// @return »ý¼º ¹× Á¢±ÙÇÑ °øÀ¯¸Þ¸ð¸® ID Value¿¡ ´ëÇÑ ÂüÁ¶. int GetShmId(void) const { return m_iShmId; } private: ///< m_pShm °øÀ¯¸Þ¸ð¸®¿¡ ´ëÇÑ Æ÷ÀÎÅÍ T * m_pShm; ///< m_pShmId Á¢±ÙÇÑ °øÀ¯¸Þ¸ð¸®ÀÇ ID Value int m_iShmId; }; //////////////////////////////////////////////////////////////////////////////////////////////// // ±âº» ¸â¹öº¯¼ö ÃʱâÈ­. template < typename T > inline CShmControl::CShmControl() : m_pShm(NULL) , m_iShmId(-1) { } template < typename T > inline CShmControl::~CShmControl() { // »ý¼ºµÈ °øÀ¯¸Þ¸ð¸®¸¦ Á¾·á½Ã ´Ù¸¥ ÇÁ·Î¼¼½ºµéÀÌ »ç¿ëÇÑ´Ù¸é.. ¸¾´ë·Î »èÁ¦Çؼ­´Â ¾ÈµÇ¸ç... // ÀÌ·² °æ¿ì detach 󸮸¸ ÇØ¾ß ÇÑ´Ù. // Detach(); // ÀÌ¿Í ¹Ý´ë·Î.. ´Ù¸¥ ÇÁ·Î¼¼½º¿¡¼­ ´õÀÌ»ó ÇØ´ç °øÀ¯¸Þ¸ð¸®¸¦ »ç¿ëÇÏÁö ¾ÊÀ» °æ¿ì.. remove ó¸®ÇÑ´Ù. Remove(); } // ÇØ´ç °øÀ¯¸Þ¸ð¸®¸¦ »ý¼ºÇÑ´Ù. ¸¸¾à ±âÁ¸¿¡ »ý¼ºµÈ °ÍÀÌ ÀÖ´Ù¸é ±×³ðÀ» »ç¿ëÇϵµ·Ï ÇÑ´Ù. template < typename T > inline bool CShmControl::Create( key_t iShmKey, size_t iSize, int iModeFlag ) { // ¿ì¼± °øÀ¯ ¸Þ¸ð¸®¸¦ »ý¼ºÇØ º¾´Ï´Ù. m_iShmId = shmget( iShmKey, iSize, IPC_CREAT | IPC_EXCL | iModeFlag ); // »ý¼º¿¡ ½ÇÆÐÇÑ °æ¿ì. if( m_iShmId == -1) { // ÀÌ¹Ì ±âÁ¸¿¡ »ý¼ºµÈ ³ðÀÌ ÀÖ´ÂÁö È®ÀÎÇØ º¾½Ã´Ù. return Attach( iShmKey, iSize, iModeFlag); } // »ý¼º¿¡ ¼º°øÇÑ °æ¿ì. else { // »ý¼ºµÈ °øÀ¯ ¸Þ¸ð¸®ÀÇ Æ÷ÀÎÅ͸¦ ¹Þ¾Æ¿É´Ï´Ù. m_pShm = (T *)shmat( m_iShmId, 0, 0 ); // ¹Þ¾Æ¿Â °øÀ¯ ¸Þ¸ð¸® Æ÷ÀÎÅÍ °ªÀÌ Á¤È®Çϸé if( reinterpret_cast(m_pShm) != -1) { // ¿ø·¡ ½Ã½ºÅÛ¿¡¼­ »ý¼º½Ã ÀÚµ¿À¸·Î ÃʱâÈ­µÊ => ±×·¸Áö¸¸ »õ·ÎÀÌ »ý¼ºÀ» ÇÏ¿´À¸¹Ç·Î È®ÀÎ »ç»ì ÃʱâÈ­ ^^ memset( m_pShm, 0x00, iSize); return true; } // ¹Þ¾Æ¿Â °øÀ¯ ¸Þ¸ð¸® Æ÷ÀÎÅ͸¦ °¡Á®¿À´Âµ¥ ½ÇÆÐÇÑ °æ¿ì // => ¸¸µç³ðÀÌ »èÁ¦ÇØ ¹ö¸³½Ã´Ù. else { Remove(); return false; } } } // ±âÁ¸¿¡ »ý¼ºµÈ °Í °øÀ¯ ¸Þ¸ð¸®¿¡ Á¢±ÙÇϱâ À§Çؼ­ »ç¿ëÇÑ´Ù.. // ۰ª°ú Å©±â°ªÀ» Á¤È®È÷ ¾Ë°í ÀÖ¾î¾ß ( Ȥ½Ã ´Ù¸¥µ¥¼­ »ç¿ëÇÏ´Â ³ðÀ¸·Î ºÙÀ»±îºÁ ) Á¢±ÙÇÒ ¼ö ÀÖµµ·Ï ÇÑ´Ù. template < typename T > inline bool CShmControl::Attach( key_t iShmKey, size_t iSize, int iModeFlag ) { // ±âÁ¸ ¿¬°áÀº ÇØÁ¦ ½ÃÄÑ ¹ö¸°´Ù. => ±×³É ³õÀº »óÅ¿¡¼­ ´Ù½Ã Á¢¼ÓÇÒ °æ¿ì ¸Þ¸ð¸® »ç¿ë·®ÀÌ ¿Ã¶ó°¨. Detach(); m_iShmId = shmget( iShmKey, iSize, iModeFlag); if( m_iShmId == -1 ) return false; else { // ¿ì¼± ±âÁ¸¿¡ ÀÖ´Â °Í°ú Å©±â°¡ µ¿ÀÏÇÑÁö °Ë»çÇÑ´Ù. struct shmid_ds shmInfo; memset(&shmInfo, 0x00, sizeof(struct shmid_ds)); shmctl( m_iShmId, IPC_STAT, &shmInfo); // shm_segsz Á¤ÀÇ °ü·Ã Âü°í»çÇ× // - FreeBSD 6.X : int typeÀ¸·Î Á¤ÀǵǾî.. ÄÄÆÄÀϽà waring ¹ß»ý // - FreeBSD 10.X : size_t type // - CentOS 6.4 : size_t type if( shmInfo.shm_segsz != iSize) return false; else { m_pShm = (T *)shmat( m_iShmId, 0, 0 ); // reinterpret_cast À» »ç¿ëÇÑ °ÍÀº ¿î¿µÃ¼Á¦¸¶´Ù Æ÷ÀÎÅÍ ÇüÀÌ ´Ù¸¦¼ö°¡ ÀÖ´Ù°í Âü°íÇÑ ¶óÀ̺귯¸®¿¡ ³ª¿ÍÀ־ ÇÔ. if( reinterpret_cast(m_pShm) == -1) return false; else return true; } } } // Á¢±ÙÇÑ °øÀ¯¸Þ¸ð¸®·Î ºÎÅÍ ºÐ¸®½ÃŲ´Ù. ( Á¢±Ù½Ã ¼³Á¤µÈ ¸â¹ö º¯¼ö ÀÌ¿ë) template < typename T > inline bool CShmControl::Detach() { if( m_pShm > 0 ) { if( shmdt( m_pShm) == 0) { m_iShmId = -1; m_pShm = NULL; return true; } else return false; } else return true; } // °øÀ¯¸Þ¸ð¸®¸¦ »èÁ¦ÇÑ´Ù. ÀÌ ÀÛ¾÷À» Çϱâ À§Çؼ­´Â ¸ÕÀú °øÀ¯ ¸Þ¸ð¸®¸¦ »ý¼º ¶Ç´Â Á¢±ÙÀ» ÇØ¾ßÇϸç // À̶§ ¼³Á¤µÈ ¸â¹ö º¯¼ö¸¦ °¡Áö°í »èÁ¦ ÀÛ¾÷À» ¼öÇàÇÑ´Ù. // °øÀ¯ ¸Þ¸ð¸®´Â ¿©·¯ Process µéÀÌ »ç¿ë°¡´ÉÇϱ⠶§¹®¿¡ »èÁ¦½Ã ½ÅÁßÀ» ±âÇÒ °Í. template < typename T > inline bool CShmControl::Remove() { if( m_iShmId > -1) { if( shmctl( m_iShmId, IPC_RMID, NULL) == -1) return false; else { m_iShmId = -1; m_pShm = NULL; return true; } } return true; } #endif /* __SHM_CONTROL_H__ */