ºìÁªLinuxÃÅ»§
Linux°ïÖú

ÔÚRedHatLinuxÖÐʹÓù²Ïí¶ÔÏó

·¢²¼Ê±¼ä:2006-02-20 14:24:50À´Ô´:ºìÁª×÷Õß:LinuxÅàѵ²¿³¤
¡¡¡¡³ä·ÖÀûÓù²ÏíÄÚ´æ²¢²»×ÜÊÇÈÝÒ׵ġ£ÔÚ±¾ÎÄÖУ¬IBM µÄ Sachin Agrawal ÓëÎÒÃǹ²ÏíÁËËûµÄ C++ רÃż¼Êõ£¬Õ¹Ê¾ÁËÃæÏò¶ÔÏóÈçºÎÈ¥ÀûÓÃÒ»¸ö¶ÀÌضøʵÓõĽø³Ì¼äͨÐÅͨµÀµÄ¹Ø¼üÓÅÊÆ¡£
¡¡¡¡
¡¡¡¡¾Íʱ¼äºÍ¿Õ¼ä¶øÑÔ£¬¹²ÏíÄÚ´æ¿ÉÄÜÊÇËùÓÐÏÖ´ú²Ù×÷ϵͳ¶¼¾ß±¸µÄ×î¸ßЧµÄ½ø³Ì¼äͨÐÅͨµÀ¡£¹²ÏíÄÚ´æ ͬʱ½«µØÖ·¿Õ¼äÓ³Éäµ½¶à¸ö½ø³Ì£ºÒ»¸ö½ø³ÌÖ»ÐèÒÀ¸½µ½¹²ÏíÄÚ´æ²¢ÏñʹÓÃÆÕͨÄÚ´æÒ»ÑùʹÓÃËü£¬¾Í¿ÉÒÔ¿ªÊ¼ÓëÆäËû½ø³Ì½øÐÐͨÐÅ¡£
¡¡¡¡
¡¡¡¡²»¹ý£¬ÔÚÃæÏò¶ÔÏó±à³ÌÁìÓòÖУ¬½ø³Ì¸üÇãÏòÓÚʹÓù²Ïí¶ÔÏó¶ø²»ÊÇԭʼµÄÐÅÏ¢¡£Í¨¹ý¶ÔÏ󣬲»ÐèÒªÔÙ¶Ô¶ÔÏóÖÐÈÝÄɵÄÐÅÏ¢½øÐÐÐòÁл¯¡¢´«ÊäºÍ·´ÐòÁл¯¡£¹²Ïí¶ÔÏóҲפÁôÔÚ¹²ÏíÄÚ´æÖУ¬¾¡¹ÜÕâÖÖ¶ÔÏó¡°ÊôÓÚ¡±´´½¨ËüÃǵĽø³Ì£¬µ«ÊÇϵͳÖеÄËùÓнø³Ì¶¼¿ÉÒÔ·ÃÎÊËüÃÇ¡£Òò´Ë£¬¹²Ïí¶ÔÏóÖеÄËùÓÐÐÅÏ¢¶¼Ó¦¸ÃÊÇÑϸñÓëÌض¨½ø³ÌÎ޹صġ£
¡¡¡¡
¡¡¡¡ÕâÓ뵱ǰËùÓÐÁ÷ÐеıàÒëÆ÷Ëù²ÉÓÃµÄ C++ Ä£ÐÍÊÇÖ±½Óì¶ÜµÄ£ºC++ ¶ÔÏóÖÐ×ÜÊÇ°üº¬Ö¸Ïò¸÷ÖÖ Vee-Table ºÍ×Ó¶ÔÏóµÄÖ¸Õ룬ÕâЩÊÇ ÓëÌض¨½ø³ÌÏà¹ØµÄ¡£ÒªÈÃÕâÖÖ¶ÔÏó¿ÉÒÔ¹²Ïí£¬ÄúÐèҪȷ±£ÔÚËùÓнø³ÌÖÐÕâЩָÕëµÄÄ¿±ê¶¼×¤ÁôÔÚÏàͬµÄµØÖ·¡£
¡¡¡¡
¡¡¡¡ÔÚÒ»¸öСµÄʾÀýµÄ°ïÖúÏ£¬±¾ÎÄչʾÁËÔÚÄÄЩÇé¿öÏ C++ Ä£ÐÍ¿ÉÒԳɹ¦Ê¹Óù²ÏíÄÚ´æÄ£ÐÍ£¬ÄÄЩÇé¿öϲ»ÄÜ£¬ÒÔ¼°¿ÉÄÜ´ÓÄÄÀï×ÅÊÖ¡£ÌÖÂÛºÍʾÀý³ÌÐò¶¼Ö»ÏÞÓڷǾ²Ì¬Êý¾Ý³ÉÔ±ºÍÐ麯Êý¡£ÆäËûÇéÐβ»ÏñËüÃÇÕâÑùÓë C++ ¶ÔÏóÄ£Ð͹ØϵÃÜÇУº¾²Ì¬µÄºÍ·Ç¾²Ì¬·ÇÐéÄâµÄ³ÉÔ±º¯ÊýÔÚ¹²Ïí»·¾³ÖÐûÓÐÈκÎÎÊÌ⡣ÿ¸ö½ø³ÌµÄ¾²Ì¬³ÉÔ±²»×¤ÁôÔÚ¹²ÏíÄÚ´æÖУ¨Òò´ËûÓÐÎÊÌ⣩£¬¶ø¹²ÏíµÄ¾²Ì¬³ÉÔ±µÄÎÊÌâÓëÕâÀïÌÖÂÛµ½µÄÎÊÌâÀàËÆ¡£
¡¡¡¡
¡¡¡¡»·¾³¼Ù¶¨

¡¡¡¡±¾ÎĽö¾ÖÏÞÓÚÓÃÓÚ 32 λ x86 Interl Ìåϵ½á¹¹µÄ Red Hat Linux 7.1£¬Ê¹Óð汾 2.95 µÄ GNU C++ ±àÒëÆ÷¼°Ïà¹Ø¹¤¾ßÀ´±àÒëºÍ²âÊÔ³ÌÐò¡£²»¹ý£¬ÄúͬÑù¿ÉÒÔ½«ËùÓеÄ˼ÏëÓ¦Óõ½ÈÎÒâµÄ»úÆ÷Ìåϵ½á¹¹¡¢²Ù×÷ϵͳºÍ±àÒëÆ÷×éºÏ¡£
¡¡¡¡
¡¡¡¡Ê¾Àý³ÌÐò
¡¡¡¡Ê¾Àý³ÌÐòÓÉÁ½¸ö¿Í»§»ú¹¹³É£ºshm_client1 ºÍ shm_client2£¬Ê¹ÓÃÓɹ²Ïí¶ÔÏó¿â shm_server ÌṩµÄ¹²Ïí¶ÔÏó·þÎñ¡£¶ÔÏó¶¨ÒåÔÚ common.h ÖУº
¡¡¡¡
¡¡¡¡Çåµ¥ 1. common.h ÖеĶ¨Òå
¡¡¡¡
¡¡¡¡
ÒýÓÃ:
#ifndef __COMMON_H__
¡¡¡¡¡¡ #define __COMMON_H__
¡¡¡¡
¡¡¡¡¡¡ class A {
¡¡¡¡¡¡ public:
¡¡¡¡¡¡¡¡¡¡ int m_nA;
¡¡¡¡¡¡¡¡¡¡ virtual void WhoAmI();
¡¡¡¡
¡¡¡¡¡¡¡¡¡¡ static void * m_sArena;
¡¡¡¡¡¡¡¡¡¡ void * operator new (unsigned int);
¡¡¡¡¡¡ };
¡¡¡¡
¡¡¡¡¡¡ class B : public A {
¡¡¡¡¡¡ public:
¡¡¡¡¡¡¡¡¡¡ int m_nB;
¡¡¡¡¡¡¡¡¡¡ virtual void WhoAmI();
¡¡¡¡¡¡ };
¡¡¡¡
¡¡¡¡¡¡ class C : virtual public A {
¡¡¡¡¡¡ public:
¡¡¡¡¡¡¡¡¡¡ int m_nC;
¡¡¡¡¡¡¡¡¡¡ virtual void WhoAmI();
¡¡¡¡¡¡ };
¡¡¡¡
¡¡¡¡¡¡ void GetObjects(A ** pA, B ** pB, C ** pC);
¡¡¡¡
¡¡¡¡¡¡ #endif //__COMMON_H__

¡¡¡¡
¡¡¡¡Çåµ¥ 1 ¶¨ÒåÁËÈý¸öÀࣨA¡¢B ºÍ C£©£¬ËüÃÇÓÐÒ»¸ö¹²Í¬µÄÐ麯Êý WhoAmI()¡£»ùÀà A ÓÐÒ»¸öÃûΪ m_nA µÄ³ÉÔ±¡£¶¨Ò徲̬³ÉÔ± m_sArena ºÍÖØÔزÙ×÷ new() ÊÇΪÁË¿ÉÒÔÔÚ¹²ÏíÄÚ´æÖй¹Ôì¶ÔÏó¡£Àà B ¼òµ¥µØ´Ó A ¼Ì³Ð£¬Àà C ´Ó A ÐéÄâµØ¼Ì³Ð¡£ÎªÁËÈ·±£ A¡¢B ºÍ C µÄ´óСÃ÷ÏÔ²»Í¬£¬¶¨ÒåÁË B::m_nB ºÍ C::m_nC¡£ÕâÑù¾Í¼ò»¯ÁË A::operator new() µÄʵÏÖ¡£GetObjects() ½Ó¿Ú·µ»Ø¹²Ïí¶ÔÏóµÄÖ¸Õë¡£
¡¡¡¡
¡¡¡¡¹²Ïí¿âµÄʵÏÖÔÚ shm_server.cpp ÖУº
¡¡¡¡Çåµ¥ 2. ¿â - shm_server.cpp
¡¡¡¡
¡¡¡¡
ÒýÓÃ:
#include
¡¡¡¡¡¡ #include
¡¡¡¡¡¡ #include
¡¡¡¡¡¡ #include
¡¡¡¡¡¡ #include
¡¡¡¡¡¡ #include
¡¡¡¡
¡¡¡¡¡¡ #include "common.h"
¡¡¡¡
¡¡¡¡¡¡ void * A::m_sArena = NULL;
¡¡¡¡
¡¡¡¡¡¡ void * A::operator new (unsigned int size)
¡¡¡¡¡¡ {
¡¡¡¡¡¡¡¡¡¡ switch (size)
¡¡¡¡¡¡¡¡¡¡ {
¡¡¡¡¡¡¡¡¡¡ case sizeof(A):
¡¡¡¡¡¡¡¡¡¡¡¡¡¡ return m_sArena;
¡¡¡¡
¡¡¡¡¡¡¡¡¡¡ case sizeof(B):
¡¡¡¡¡¡¡¡¡¡¡¡¡¡ return (void *)((int)m_sArena + 1024);
¡¡¡¡
¡¡¡¡¡¡¡¡¡¡ case sizeof(C):
¡¡¡¡¡¡¡¡¡¡¡¡¡¡ return (void *)((int)m_sArena + 2048);
¡¡¡¡
¡¡¡¡¡¡¡¡¡¡ default:
¡¡¡¡¡¡¡¡¡¡¡¡¡¡ cerr << __FILE__ << ":" << __LINE__ << " Critical error" <<
¡¡¡¡endl;
¡¡¡¡¡¡¡¡¡¡ }
¡¡¡¡¡¡ }
¡¡¡¡
¡¡¡¡¡¡ void A::WhoAmI() {
¡¡¡¡¡¡¡¡¡¡ cout << "Object type: A" << endl;
¡¡¡¡¡¡ }
¡¡¡¡
¡¡¡¡¡¡ void B::WhoAmI() {
¡¡¡¡¡¡¡¡¡¡ cout << "Object type: B" << endl;
¡¡¡¡¡¡ }
¡¡¡¡
¡¡¡¡¡¡ void C::WhoAmI() {
¡¡¡¡¡¡¡¡¡¡ cout << "Object type: C" << endl;
¡¡¡¡¡¡ }
¡¡¡¡
¡¡¡¡¡¡ void GetObjects(A ** pA, B ** pB, C ** pC) {
¡¡¡¡¡¡¡¡¡¡ *pA = (A *)A::m_sArena;
¡¡¡¡¡¡¡¡¡¡ *pB = (B *)((int)A::m_sArena + 1024);
¡¡¡¡¡¡¡¡¡¡ *pC = (C *)((int)A::m_sArena + 2048);
¡¡¡¡¡¡ }
¡¡¡¡
¡¡¡¡¡¡ class Initializer {
¡¡¡¡¡¡ public:
¡¡¡¡¡¡¡¡¡¡ int m_shmid;
¡¡¡¡¡¡¡¡¡¡ Initializer();
¡¡¡¡
¡¡¡¡¡¡¡¡¡¡ static Initializer m_sInitializer;
¡¡¡¡¡¡ };
¡¡¡¡
¡¡¡¡¡¡ Initializer Initializer::m_sInitializer;
¡¡¡¡
¡¡¡¡¡¡ Initializer::Initializer()
¡¡¡¡¡¡ {
¡¡¡¡¡¡¡¡¡¡ key_t key = 1234;
¡¡¡¡¡¡¡¡¡¡ bool bCreated = false;
¡¡¡¡
¡¡¡¡¡¡¡¡¡¡ m_shmid = shmget(key, 3*1024, 0666);
¡¡¡¡
¡¡¡¡¡¡¡¡¡¡ if (-1 == m_shmid) {
¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡ if (ENOENT != errno) {
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ cerr << __FILE__ << ":" << __LINE__ << " Critical error" <<
¡¡¡¡endl;
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ return;
¡¡¡¡¡¡¡¡¡¡¡¡¡¡ }
¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡ m_shmid = shmget(key, 3*1024, IPC_CREAT | 0666);
¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡ if (-1 == m_shmid) {
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ cerr << __FILE__ << ":" << __LINE__ << " Critical error" <<
¡¡¡¡endl;
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ return;
¡¡¡¡¡¡¡¡¡¡¡¡¡¡ }
¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡ cout << "Created the shared memory" << endl;
¡¡¡¡¡¡¡¡¡¡¡¡¡¡ bCreated = true;
¡¡¡¡¡¡¡¡¡¡ }
¡¡¡¡
¡¡¡¡¡¡¡¡¡¡ A::m_sArena = shmat(m_shmid, NULL, 0);
¡¡¡¡
¡¡¡¡¡¡¡¡¡¡ if (-1 == (int)A::m_sArena) {
¡¡¡¡¡¡¡¡¡¡¡¡¡¡ cerr << __FILE__ << ":" << __LINE__ << " Critical error" <<
¡¡¡¡endl;
¡¡¡¡¡¡¡¡¡¡¡¡¡¡ return;
¡¡¡¡¡¡¡¡¡¡ }
¡¡¡¡
¡¡¡¡¡¡¡¡¡¡ if (bCreated) {
¡¡¡¡¡¡¡¡¡¡¡¡¡¡ // Construct objects on the shared memory
¡¡¡¡¡¡¡¡¡¡¡¡¡¡ A * pA;
¡¡¡¡¡¡¡¡¡¡¡¡¡¡ pA = new A;
¡¡¡¡¡¡¡¡¡¡¡¡¡¡ pA->m_nA = 1;
¡¡¡¡¡¡¡¡¡¡¡¡¡¡ pA = new B;
¡¡¡¡¡¡¡¡¡¡¡¡¡¡ pA->m_nA = 2;
¡¡¡¡¡¡¡¡¡¡¡¡¡¡ pA = new C;
¡¡¡¡¡¡¡¡¡¡¡¡¡¡ pA->m_nA = 3;
¡¡¡¡¡¡¡¡¡¡ }
¡¡¡¡
¡¡¡¡¡¡¡¡¡¡ return;
¡¡¡¡¡¡ }

¡¡¡¡
¡¡¡¡ÈÃÎÒÃǸüÏêϸµØÑо¿Çåµ¥ 2£º
¡¡¡¡µÚ 9-25 ÐУºoperator new ()
¡¡¡¡
¡¡¡¡Í¬Ò»¸öÖØÔصIJÙ×÷·ûÈÃÄú¿ÉÒÔÔÚ¹²ÏíÄÚ´æÖй¹ÔìÀà A¡¢B ºÍ C µÄ¶ÔÏ󡣶ÔÏó A Ö±½Ó´Ó¹²ÏíÄÚ´æµÄÆðʼ´¦¿ªÊ¼¡£¶ÔÏó B ´ÓÆ«ÒÆÁ¿ 1024 ´¦¿ªÊ¼£¬C ´ÓÆ«ÒÆÁ¿ 2048 ´¦¿ªÊ¼¡£
¡¡¡¡
¡¡¡¡µÚ 26-34 ÐУºÐ麯Êý
¡¡¡¡Ð麯Êý¼òµ¥µØÏò±ê×¼Êä³öдһÐÐÎı¾¡£
¡¡¡¡
¡¡¡¡µÚ 35-39 ÐУºGetObjects
¡¡¡¡GetObjects() ·µ»ØÖ¸Ïò¹²Ïí¶ÔÏóµÄÖ¸Õë¡£
¡¡¡¡
¡¡¡¡µÚ 40-46 ÐУº³õʼ»¯Æ÷£¨Initializer£©
¡¡¡¡Õâ¸öÀà´æ´¢¹²ÏíÄÚ´æ±êʶ·û¡£ËüµÄ¹¹Ô캯Êý´´½¨¹²ÏíÄÚ´æ¼°ÆäÖеĶÔÏó¡£Èç¹û¹²ÏíÄÚ´æÒѾ­´æÔÚ£¬Ëü¾ÍÖ»ÊÇÒÀ¸½µ½ÏÖÓеĹ²ÏíÄÚ´æ¡£¾²Ì¬³ÉÔ± m_sInitializer È·±£ÔÚʹÓù²Ïí¿âµÄ¿Í»§»úÄ£¿éµÄ main() º¯Êý֮ǰµ÷Óù¹Ô캯Êý¡£
¡¡¡¡
¡¡¡¡µÚ 48-82 ÐУºInitializer::Initializer()
¡¡¡¡Èç¹ûÔ­À´Ã»Óй²ÏíÄڴ棬Ôò´´½¨£¬²¢ÔÚÆäÖд´½¨¹²Ïí¶ÔÏó¡£Èç¹û¹²ÏíÄÚ´æÒѾ­´æÔÚ£¬¶ÔÏóµÄ¹¹Ôì¾Í»á±»Ìø¹ý¡£Initializer::m_shmid ¼Ç¼±êʶ·û£¬A::m_sArena ¼Ç¼¹²ÏíÄÚ´æµØÖ·¡£
¡¡¡¡
¡¡¡¡¼´Ê¹ËùÓнø³Ì¶¼²»ÔÙʹÓÃËüÁË£¬¹²ÏíÄÚ´æÒ²²»»á±»Ïú»Ù¡£ÕâÑù¾ÍÈÃÄú¿ÉÒÔÏÔʽµØʹÓà ipcs ÃüÁîÀ´Ïú»ÙËü£¬»òÕßʹÓà ipcs ÃüÁî½øÐÐһЩËٲ顣
¡¡¡¡
¡¡¡¡¿Í»§»ú½ø³ÌµÄʵÏÖÔÚ shm_client.cpp ÖУº
¡¡¡¡Çåµ¥ 3. ¿Í»§»ú - shm_client.cpp
¡¡¡¡
¡¡¡¡
ÒýÓÃ:
#include "common.h"
¡¡¡¡
¡¡¡¡¡¡ #include
¡¡¡¡¡¡ #include
¡¡¡¡
¡¡¡¡¡¡ int main (int argc, char * argv[])
¡¡¡¡¡¡ {
¡¡¡¡¡¡¡¡¡¡ int jumpTo = 0;
¡¡¡¡
¡¡¡¡¡¡¡¡¡¡ if (1 < argc) {
¡¡¡¡¡¡¡¡¡¡¡¡¡¡ jumpTo = strtol(argv[1], NULL, 10);
¡¡¡¡¡¡¡¡¡¡ }
¡¡¡¡
¡¡¡¡¡¡¡¡¡¡ if ((1 > jumpTo) || (6 < jumpTo)) {
¡¡¡¡¡¡¡¡¡¡¡¡¡¡ jumpTo = 1;
¡¡¡¡¡¡¡¡¡¡ }
¡¡¡¡
¡¡¡¡¡¡¡¡¡¡ A * pA;
¡¡¡¡¡¡¡¡¡¡ B * pB;
¡¡¡¡¡¡¡¡¡¡ C * pC;
¡¡¡¡
¡¡¡¡¡¡¡¡¡¡ GetObjects(&pA, &pB, &pC);
¡¡¡¡
¡¡¡¡¡¡¡¡¡¡ cout << (int)pA << "\t";
¡¡¡¡¡¡¡¡¡¡ cout << (int)pB << "\t";
¡¡¡¡¡¡¡¡¡¡ cout << (int)pC << "\n";
¡¡¡¡
¡¡¡¡¡¡¡¡¡¡ switch (jumpTo) {
¡¡¡¡¡¡¡¡¡¡ case 1:
¡¡¡¡¡¡¡¡¡¡¡¡¡¡ cout << pA->m_nA << endl;
¡¡¡¡
¡¡¡¡¡¡¡¡¡¡ case 2:
¡¡¡¡¡¡¡¡¡¡¡¡¡¡ pA->WhoAmI();
¡¡¡¡
¡¡¡¡¡¡¡¡¡¡ case 3:
¡¡¡¡¡¡¡¡¡¡¡¡¡¡ cout << pB->m_nA << endl;
¡¡¡¡
¡¡¡¡¡¡¡¡¡¡ case 4:
¡¡¡¡¡¡¡¡¡¡¡¡¡¡ pB->WhoAmI();
¡¡¡¡
¡¡¡¡¡¡¡¡¡¡ case 5:
¡¡¡¡¡¡¡¡¡¡¡¡¡¡ cout << pC->m_nA << endl;
¡¡¡¡
¡¡¡¡¡¡¡¡¡¡ case 6:
¡¡¡¡¡¡¡¡¡¡¡¡¡¡ pC->WhoAmI();
¡¡¡¡¡¡¡¡¡¡ }
¡¡¡¡
¡¡¡¡¡¡¡¡¡¡ return 0;
¡¡¡¡¡¡ }
¡¡¡¡
¡¡¡¡¡¡ #include
¡¡¡¡
¡¡¡¡¡¡ void DoNothingCode() {
¡¡¡¡¡¡¡¡¡¡ pthread_create(NULL, NULL, NULL, NULL);
¡¡¡¡¡¡ }

¡¡¡¡
¡¡¡¡µÚ 6-35 ÐÐ
¡¡¡¡¿Í»§»ú½ø³Ì»ñµÃÖ¸ÏòÈý¸ö¹²Ïí¶ÔÏóµÄÖ¸Õ룬½¨Á¢¶ÔËüÃǵÄÊý¾Ý³ÉÔ±µÄÈý¸öÒýÓ㬲¢ÇÒ ---- ÒÀÀµÓÚÃüÁîÐеÄÊäÈë ---- µ÷ÓÃÈý¸öÐ麯Êý¡£
¡¡¡¡
¡¡¡¡µÚ 36-39 ÐÐ
¡¡¡¡Ã»Óб»µ÷ÓÃµÄ pthread_create() º¯ÊýÓÃÀ´Ç¿ÖÆÁ´½Óµ½ÁíÒ»¸ö¹²Ïí¿â¡£À´×ÔËùÓй²Ïí¿âµÄÈκη½·¨¶¼¿ÉÒÔÂú×ãÕâһĿµÄ¡£
¡¡¡¡
¡¡¡¡¹²Ïí¿âºÍ¿Í»§»ú¿ÉÖ´ÐÐÎļþµÄÁ½¸öʵÀýµÄ±àÒë·½·¨ÈçÏ£º
¡¡¡¡
¡¡¡¡gcc shared g shm_server.cpp o libshm_server.so lstdc++
¡¡¡¡gcc -g shm_client.cpp -o shm_client1 -lpthread -lshm_server -L .
¡¡¡¡gcc -g shm_client.cpp -o shm_client2 -lshm_server -L . lpthread
¡¡¡¡
¡¡¡¡×¢Ò⣬½»»»ÁË shm_client1 ºÍ shm_client2 ÖÐ shm_server ºÍ pthread µÄÁ´½Ó˳Ðò£¬ÒÔÈ·±£ shm_server ¹²Ïí¿âÔÚÁ½¸ö¿ÉÖ´ÐÐÎļþÖеĻùÖ·²»Í¬¡£¿ÉÒÔʹÓà ldd ÃüÁî½øÒ»²½ÑéÖ¤ÕâÒ»µã¡£Ê¾ÀýÊä³öͨ³£ÈçÏÂËùʾ£º
¡¡¡¡Çåµ¥ 4. shm_client1 µÄ¿âÓ³Éä
¡¡¡¡
¡¡¡¡
ÒýÓÃ:
ldd shm_client1
¡¡¡¡
¡¡¡¡libpthread.so.0 => (0x4002d000)
¡¡¡¡libshm_server.so => (0x40042000)
¡¡¡¡libc.so.6 => (0x4005b000)
¡¡¡¡ld-linux.so.2 => (0x40000000)
¡¡¡¡Çåµ¥ 5. shm_client2 µÄ¿âÓ³Éä
¡¡¡¡
¡¡¡¡¡¡¡¡ bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center">
¡¡¡¡
¡¡¡¡¡¡¡¡

¡¡¡¡¡¡¡¡
 ldd shm_client2

¡¡¡¡
¡¡¡¡libshm_server.so => (0x40018000)
¡¡¡¡libpthread.so.0 => (0x40046000)
¡¡¡¡libc.so.6 => (0x4005b000)
¡¡¡¡ld-linux.so.2 => (0x40000000)
¡¡¡¡
¡¡¡¡ÕâÀïµÄÖ÷ҪĿµÄÊÇʹ¹¹½¨µÄÁ½¸ö¿Í»§»ú¶þ½øÖÆÎļþ¾ßÓв»Í¬µÄ·þÎñÆ÷¿â»ùÖ·¡£ÔÚÕâ¸öʾÀý³ÌÐòµÄÉÏÏÂÎÄÖУ¬Ê¹Óò»±»µ÷ÓÃµÄ pthread_create() º¯ÊýºÍ²»Í¬µÄ¹²Ïí¿âÁ´½Ó˳ÐòÀ´´ïµ½ÕâһĿ±ê¡£²»¹ý£¬Ã»ÓоßÌå¹æÔò»òͳһ²½Öè¿ÉÒÔ×÷ÓÃÓÚËùÓÐÁ´½Ó£»ÐèÒª¸ù¾Ý²»Í¬µÄÇé¿ö²ÉÈ¡²»Í¬µÄ·½·¨¡£
¡¡¡¡
¡¡¡¡Àý 1£ºshm_client1 Óë shm_client1
¡¡¡¡ÔÚÏÂÃæµÄÊä³öÖУ¬Ê×ÏÈÔÚ shell Öе÷Óà shm_client1¡£ÓÉÓÚÏÖÔÚûÓй²Ïí¶ÔÏó£¬ÓÚÊÇ shm_client1 ´´½¨ÁËËüÃÇ£¬ÒýÓÃËüÃǵÄÊý¾Ý³ÉÔ±£¬µ÷ÓÃËüÃǵÄÐ麯Êý£¬È»ºóÍ˳ö ---- ½«¶ÔÏóÁôÔÚÁËÄÚ´æÖС£µÚ¶þ´Î£¬½ø³ÌÖ»ÊÇÒýÓÃÊý¾Ý³ÉÔ±ºÍÐ麯Êý¡£
¡¡¡¡
¡¡¡¡Çåµ¥ 6. shm_client1 Óë shm_client1 µÄÊä³öÈÕÖ¾
¡¡¡¡
¡¡¡¡
ÒýÓÃ:
$ ./shm_client1
¡¡¡¡
¡¡¡¡¡¡ Created the shared memory
¡¡¡¡¡¡ 1073844224 1073845248 1073846272
¡¡¡¡¡¡ 1
¡¡¡¡¡¡ Object type: A
¡¡¡¡¡¡ 2
¡¡¡¡¡¡ Object type: B
¡¡¡¡¡¡ 3
¡¡¡¡¡¡ Object type: C
¡¡¡¡
¡¡¡¡¡¡ $ ipcs
¡¡¡¡
¡¡¡¡¡¡ ------ Shared Memory Segments --------
¡¡¡¡
¡¡¡¡¡¡ key shmid owner perms bytes nattch status
¡¡¡¡¡¡ 0x000004d2 2260997 sachin 666 3072 0
¡¡¡¡
¡¡¡¡¡¡¡¡ $ ./shm_client1
¡¡¡¡¡¡¡¡ 1073840128 1073841152 1073842176
¡¡¡¡¡¡¡¡ 1
¡¡¡¡¡¡¡¡ Object type: A
¡¡¡¡¡¡¡¡ 2
¡¡¡¡¡¡¡¡ Object type: B
¡¡¡¡->¡¡ 0
¡¡¡¡->¡¡ Segmentation fault (core dumped)

¡¡¡¡
¡¡¡¡µ±µÚ¶þ¸ö½ø³ÌÊÔͼͨ¹ýÀàÐÍ C * µÄÖ¸ÕëÈ¥ÒýÓÃÊý¾Ý³ÉÔ± A::m_nA ʱ£¨Äú»á¼ÇµÃ C ÐéÄâ¼Ì³Ð×Ô A£©£¬¹²Ïí¶ÔÏóÄڵĻù×Ó¶ÔÏó£¨base sub-object£©Ö¸Õë»á±»¶ÁÈ¡¡£¹²Ïí¶ÔÏóÊÇÔÚÏÖÔÚ²»´æÔڵĽø³ÌµÄÉÏÏÂÎÄÖй¹ÔìµÄ¡£Òò´Ë£¬¶ÁÈ¡ A::m_nA ºÍ C::WhoAmI() ʱ¶ÁÈëµÄÊÇÄÚ´æÀ¬»ø¡£
¡¡¡¡
¡¡¡¡ÒòΪ Vee-Table ºÍÐ麯ÊýλÓÚ shm_server ¹²Ïí¿âÄÚ²¿£¬Ç¡ÇÉÔÚͬһÐéÄâµØÖ·±»ÖØмÓÔØ£¬ËùÒÔ£¬ÔÙ´ÎÒýÓÃÀàÐÍ A * ºÍ B * µÄÖ¸Õëʱ²»»á¹Û²ìµ½ÈκÎÎÊÌâ¡£
¡¡¡¡
¡¡¡¡Òò´Ë£¬GNU Ëù²ÉÓÃµÄ C++ ¶ÔÏóÄ£ÐÍûÓгɹ¦µØ´¦ÀíÐéÄâ¼Ì³Ð¡£
¡¡¡¡
¡¡¡¡Àý 2£ºshm_client1 Óë shm_client2
¡¡¡¡ÔÚÏÂÒ»¸öʾÀýÊä³öÖУ¬ÔÚÃüÁîÐÐÖÐÊ×ÏÈÖ´ÐÐ shm_client1£¬È»ºóÖ´ÐÐ shm_client2£º
¡¡¡¡Çåµ¥ 7. shm_client1 Óë shm_client2 µÄÊä³öÈÕÖ¾
¡¡¡¡
¡¡¡¡
ÒýÓÃ:
$ ./shm_client1
¡¡¡¡
¡¡¡¡¡¡ Created the shared memory
¡¡¡¡¡¡ 1073844224 1073845248 1073846272
¡¡¡¡¡¡ 1
¡¡¡¡¡¡ Object type: A
¡¡¡¡¡¡ 2
¡¡¡¡¡¡ Object type: B
¡¡¡¡¡¡ 3
¡¡¡¡¡¡ Object type: C
¡¡¡¡
¡¡¡¡¡¡ $ ipcs
¡¡¡¡
¡¡¡¡¡¡ ------ Shared Memory Segments --------
¡¡¡¡¡¡ key shmid owner perms bytes nattch status
¡¡¡¡¡¡ 0x000004d2 2359301 sachin 666 3072 0
¡¡¡¡
¡¡¡¡¡¡ $ ./shm_client2
¡¡¡¡¡¡ 1073942528 1073943552 1073944576
¡¡¡¡¡¡ 1
¡¡¡¡-> Segmentation fault (core dumped)
¡¡¡¡
¡¡¡¡¡¡ $ ./shm_client2 3
¡¡¡¡¡¡ 1073942528 1073943552 1073944576
¡¡¡¡¡¡ 2
¡¡¡¡-> Segmentation fault (core dumped)
¡¡¡¡
¡¡¡¡¡¡ $ ./shm_client2 5
¡¡¡¡¡¡ 1073942528 1073943552 1073944576
¡¡¡¡-> 1048594
¡¡¡¡-> Segmentation fault (core dumped)

¡¡¡¡
¡¡¡¡È»¶ø£¬Vee-Table λÓÚ shm_server ¹²Ïí¿âÄÚ²¿£ºÔÚ shm_client1 ºÍ shm_client2 ÖÐËü±»¼ÓÔص½²»Í¬µÄÐéµØÖ·¡£ÕâÑù£¬¶ÁÈ¡ A::WhoAmI() ºÍ B::WhoAmI() ʱ¶ÁÈëµÄ¶¼ÊÇÄÚ´æÀ¬»ø¡£
¡¡¡¡
¡¡¡¡ÔËÓù²ÏíÄÚ´æ
¡¡¡¡ÔÚ¹²ÏíÄÚ´æÖоßÌåʹÓà C++ ¶ÔÏóʱÄúÓ¦¸Ã¿¼ÂÇÁ½¸öÖ÷ÒªÎÊÌâ¡£Ê×ÏÈ£¬Vee-Table Ö¸ÕëÓÃÓÚ·ÃÎÊÐ麯Êý£¬¶ø¶ÔÊý¾Ý³ÉÔ±µÄ·ÃÎÊÖ±½ÓʹÓñàÒëʱƫÒÆÁ¿ÊµÏÖ¡£Òò´Ë£¬¶ÔÓÚËùÓÐÕâÖÖ¹²Ïí¶ÔÏóÀ´Ëµ£¬ËùÓнø³ÌÖÐµÄ Vee-Table ºÍÐ麯Êý¶¼Ó¦¸Ã¾ßÓÐÏàͬµÄÐéµØÖ·¡£¹ØÓÚÕâÒ»µã£¬Ã»ÓÐÒ»³É²»±äµÄ¹æÔò£¬²»¹ý£¬ÎªÏà¹ØµÄ¹²Ïí¿â²ÉÓÃÊʵ±µÄÁ´½Ó˳Ðò´ó²¿·Öʱºò¶¼»á¹ÜÓá£
¡¡¡¡
¡¡¡¡ÁíÍ⣬ÓÀÔ¶²»ÒªÍü¼Ç£¬ÐéÄâ¼Ì³ÐµÄ¶ÔÏóÓÐÖ¸Ïò»ù¶ÔÏóµÄ»ùÖ¸Õë¡£»ùÖ¸ÕëÒýÓýø³ÌµÄÊý¾Ý¶Î£¬¶øÇÒÓÀÔ¶ÊÇÌض¨ÓÚ½ø³ÌµÄ¡£ÄÑÒÔÈ·±£ËùÓеĿͻ§»ú½ø³ÌÖж¼ÓÐÏàͬµÄÊý×ÖÖµ¡£Òò´Ë£¬¼ÙÈçʹÓà C++ ¶ÔÏóÄ£ÐÍ£¬Òª±ÜÃâÔÚ¹²ÏíÄÚ´æÖй¹ÔìÐéÄâ¼Ì³ÐµÄ¶ÔÏó¡£µ«ÊÇ£¬Ò²²»ÒªÍü¼Ç£¬²»Í¬µÄ±àÒëÆ÷²ÉÓõÄÊDz»Í¬µÄ¶ÔÏóÄ£ÐÍ¡£ÀýÈ磬Microsoft Compiler ʹÓýø³ÌÎ޹صÄÆ«ÒÆÁ¿À´ÎªÐéÄâ¼Ì³ÐÀàÖ¸¶¨»ù¶ÔÏó£¬Òò¶ø²»´æÔÚÕâ¸öÎÊÌâ¡£ÖØÒªµÄÊÇ£¬È·±£ËùÓпͻ§»ú½ø³ÌÖеĹ²Ïí¶ÔÏóµÄµØÖ·Ïàͬ¡£
ÎÄÕÂÆÀÂÛ

¹²ÓÐ 0 ÌõÆÀÂÛ