首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

共享内存的有关问题 请高手指教

2012-02-05 
共享内存的问题 请高手指教externC {#includesys/types.h#includesys/ipc.h#includesys/shm.h#inc

共享内存的问题 请高手指教
extern   "C "   {
        #include   <sys/types.h>
        #include   <sys/ipc.h>
        #include   <sys/shm.h>
        #include   <sys/sem.h>
        #include   <stdio.h>
        #include   <stdlib.h>
        #include   <errno.h>
        #include   <string.h>
        #include   <getopt.h>
}

void   usage(int   argc,   char**   argv)
{
        printf( "%s   arguments\n ",   argv[0]);
        printf( "-h                           help   mode.\n ");
        printf( "-c                           create   shm.\n ");
        printf( "-m   <message>       write   message   into   shm.\n ");
        printf( "-r                           read   message   from   shm.\n ");
        printf( "-d                           destroy   shm.\n ");
}

typedef   enum   {SHM_UNKNOW   =   0,   SHM_CREATE,   SHM_DESTROY,   SHM_WRITE,   SHM_READ}   SHM_MODE;

#define   SHM_KEY   1234
#define   SHM_SIZE   1000

/**IPC_ALLOC   is   solaris   specific
  */
#if   !defined(   IPC_ALLOC   )
        #define   IPC_ALLOC   IPC_CREAT
#endif

/**   create   shm   with   SHM_KEY
  *   @return   shmid
  */
int   shm_create();

/**   open   shm   with   SHM_KEY
  *   @return   shmid
  */
int   shm_open();

/**   destroy   shm   which   shm   key   is   SHM_KEY
  */
void   shm_destroy(int   shmid);

/**   write   a   string   into   shm,   the   string   should   be   teminated   by   null.
  */
void   shm_write(int,   char*);

/**   read   message   from   shm
  @param   the   shmid
  */
void   shm_read(int   shmid);

/**   detach   from   shm
  */
void   shm_close(const   void*   root);

int   main(int   argc,   char**   argv)
{
        SHM_MODE   shm_mode   =   SHM_UNKNOW;
        char*   message   =   NULL;
        int   shmid   =   0;

        int   opt   =   0   ;
        extern   int   optind   ;
        extern   char*   optarg   ;

        while   ((opt   =   getopt   (argc,   argv,   "hcrm:d "))   !=   EOF)   {


                switch   (opt)   {
                        case   'h '   :     //   help   mode
                                usage(argc,   argv);
                                return   0;
                        case   'c '   :     //create   mode
shm_mode   =   SHM_CREATE;
                                break;
case   'd '   :     //destroy   mode
                                shm_mode   =   SHM_DESTROY;
                                break;
                        case   'r ':       //read   message
                                shm_mode   =   SHM_READ;
                                break;
                        case   'm ':       //write   message
                                shm_mode   =   SHM_WRITE;
                                message   =   (char*)optarg;
                                break;
                        default   :
                                usage(argc,   argv);
                                return   -1;
                }
        }
       
        switch   (shm_mode){
                case   SHM_CREATE:
                        shmid   =   shm_create();
                        break;
                case   SHM_DESTROY:
                        shmid   =   shm_open();
                        shm_destroy(shmid);
                        break;
                case   SHM_READ:
                        shmid   =   shm_open();


                        shm_read(shmid);
                        break;
                case   SHM_WRITE:
                        shmid   =   shm_open();
                        shm_write(shmid,   message);
                        break;
                default:
                        usage(argc,   argv);
                        return   -1;
        }
}

int   shm_create()
{
        int   shmid   =   shmget   (SHM_KEY,   SHM_SIZE,   IPC_CREAT   |   0666);
        if(shmid   <   0){
                printf( "failed   to   allocate   shm   %s(%d)\n ",   strerror(errno));
        }
        return   shmid;
}

int   shm_open()
{
        int   shmid   =   shmget   (SHM_KEY,   SHM_SIZE,   IPC_ALLOC   |   0666);
        if(shmid   <   0){
                printf( "failed   to   open   shm   %s(%d)\n ",   strerror(errno));
        }
        return   shmid;
}

void   shm_destroy(int   shmid)
{
        if(shmid   <=   0)
                return;
        struct   shmid_ds   buf   ;
        int   ret   =   shmctl   (shmid,   IPC_RMID,   &buf)   ;
        if   (ret   <   0){
                printf( "failed   to   destroy   shm   %s(%d)\n ",   strerror(errno));
        }
}

void   shm_write(int   shmid,   char*   message)
{
        if(shmid   <=   0)
                return;
        void*   root   =   shmat   (shmid,   0,   0);
        if   (root   ==   (char*)-1){
                printf( "failed   to   attach   shm   %s(%d)\n ",   strerror(errno));
                return;
        }
        memset(root,   0,   SHM_SIZE);
        strncpy((char*)root,   message,   SHM_SIZE   -   1);
        shm_close(root);
}

void   shm_read(int   shmid)
{
        if(shmid   <=   0)
                return;


        char*   root   =   (char*)shmat   (shmid,   0,   0);
        if   (root   ==   (char*)-1){
                printf( "failed   to   attach   shm   %s(%d)\n ",   strerror(errno));
                return;
        }
        if(strlen(root)   >   0)
                printf( "%s\n ",   root);
        else
                printf( "SHM   is   empty!\n ");
        shm_close(root);
}

void   shm_close(const   void*   root)
{
        if(root   ==   NULL)
                return;
        int   ret   =   shmdt   (root);
        if(ret   <   0){
                printf( "failed   to   detach   shm   %s(%d)\n ",   strerror(errno));
        }
}


小弟出学共享内存
用g++   -g   -o   shm_example   main.cc   编译后
没有共享内存时   运行   shm_example   -r   时能正常输出SHM   is   empty!
但是同时自动建一个共享内存     这是我不想要的  
怎么才能在没有共享内存时只输出信息   而不新建共享内存


小弟在此谢过


[解决办法]
你在 shm_read前已经创建共享内存了,并且已经shmat上。
只是strlen的判断=0而且,表示的根本不是SHM is empty!

热点排行