none
共有メモリでデータ受け渡しが出来ない事があります RRS feed

  • 質問

  • こんにちは。共有メモリについて質問があります。

    プロセスAとプロセスBとプロセスCがあり、共有メモリを持ちます。
    プロセスAが送信者
    プロセスB&Cを受信者とします。

    プロセスAからプロセスBのデータ受け渡しは常に成功します。
    プロセスA・プロセスB共に私が1から作成したテストのソースコードからコンパイルしたものです。

    プロセスCは私が手を入れようとしている既製品のソースコードなのですが、
    プロセスAからプロセスCのデータ受け渡しは常に*失敗*します。
    デバッグでプロセスBとプロセスCのソース自体を同一にまでにしたのですが、まだ失敗です。

    問題はプロセスCをコンパイルするときの設定でしょうか?
    問題が何かも分からないので、質問させて頂いています。ご回答いただければ幸いです。

    ちなみにソースは以下の通りです。
    C++ではなくCで書いているのは、持っているプロセスCに関してはCで書かれているからです。
    shmem_c.c とshmem_c.hに関しては、プロセスA,B,Cで同じものを使用しています。

    ///////////////////////////////////////////////////////////////////
    //shmem_c.h
    #include <stdio.h>
    #include <windows.h>
    #define SHMEM_NAMELEN 64
    #define SHMEM_MAXSIZE 256//TODO: make it dynamic
    typedef struct shmem{
     int sz;
     char name[SHMEM_NAMELEN];
     HANDLE m_hMappingg;
    }Shmem;

    void ShmemInit(Shmem *sh, char name[SHMEM_NAMELEN],int sz);
    void ShmemDeInit(Shmem *sh);
    void ShmemReceiveInt(Shmem *sh,int *retval);
    void ShmemSendInt(Shmem *sh,int val);
    //end of shmem_c.h
    =====================================
    //shmem_c.c
    #include "shmem_c.h"

    void ShmemInit(Shmem *sh, char name[SHMEM_NAMELEN],int sz){
     LPSTR lpBuf;
     int i;
     printf("constructing shared memory\n");
     if(sz <= SHMEM_MAXSIZE)
      sh->sz = sz;
     else
      sh->sz = SHMEM_MAXSIZE;

     for(i = 0;i < SHMEM_NAMELEN; i++)
      sh->name[i] = name[i];
      sh->m_hMappingg = CreateFileMapping(INVALID_HANDLE_VALUE,
                                NULL, PAGE_READWRITE,
                                0, sh->sz, (LPCSTR)(sh->name));//"state_sig_im"
     if(sh->m_hMappingg == NULL){
      printf("shared memory couldnot create - error 1\n");
      return;
     }
     lpBuf = (LPSTR)MapViewOfFile(sh->m_hMappingg,
                                FILE_MAP_ALL_ACCESS, 0, 0, 0);//mapping
     if(lpBuf == NULL){
      printf("shared memory couldnot access - error 2\n");
      CloseHandle(sh->m_hMappingg);
         sh->m_hMappingg = NULL;
         return;
     }
     ZeroMemory(lpBuf,sh->sz);//init shared mem
     UnmapViewOfFile(lpBuf);//relieasing sghared mem
    }

    void ShmemDeInit(Shmem *sh){
        if(sh->m_hMappingg != NULL){
            CloseHandle(sh->m_hMappingg);
            sh->m_hMappingg = NULL;
        }
    }

    void ShmemReceiveInt(Shmem *sh,int *retval){
     LPSTR lpBuf;
     HANDLE hMapping;
     char local1[SHMEM_MAXSIZE];
     hMapping = OpenFileMapping(FILE_MAP_READ, FALSE,
      (LPCSTR)(sh->name));//opening shared mem
     if(hMapping == NULL){
         printf( "shared memory not exist - error 3\n");
      return;
     }
     lpBuf = (LPSTR)MapViewOfFile(hMapping,
                                FILE_MAP_READ,
                                0, 0, 0);//mapping shared mem
     if(lpBuf == NULL){
         printf( "failed to map shared memory - error 4\n");
         return;
     }
     
     if(sh->sz <= SHMEM_MAXSIZE)
      strcpy_s(local1,sh->sz,lpBuf);
     else{
      printf("could not copy all\n");
      strcpy_s(local1,SHMEM_MAXSIZE,lpBuf);
     }
     UnmapViewOfFile(lpBuf);//releasing the mapping
     CloseHandle( hMapping);//closing shared mem handler
     *retval = atoi(local1);
     return;
    }

    void ShmemSendInt(Shmem *sh,int val){
     HANDLE hMapping;
     LPSTR lpBuf;
     char val_a[SHMEM_MAXSIZE];
      //opening shared mem
     hMapping = OpenFileMapping(FILE_MAP_WRITE, FALSE,(LPCSTR)(sh->name));
     if(hMapping == NULL){
         printf( "shared memory not exist - error 3\n");
      return;
     }
     //mapping shared mem
     lpBuf = (LPSTR)MapViewOfFile(hMapping,
                                FILE_MAP_WRITE,
                                0, 0, 0);
     if(lpBuf == NULL){
         printf( "failed to map shared memory - error 4\n");
         return;
     }
     _itoa_s(val,val_a,SHMEM_MAXSIZE,10);
     lstrcpy(lpBuf,(LPSTR)(val_a));
     UnmapViewOfFile(lpBuf);//releasing the mapping
     CloseHandle(hMapping);//closing shared mem handler
    }

    //end of shmem_c.c
    =====================================
    //main.c of processA -- sender
    ...
     Shmem *state_sig_im;
     int state_out;

    int _tmain(int argc, _TCHAR* argv[]){
    state_sig_im = (struct shmem*)malloc( sizeof(struct shmem) );
     ShmemInit(state_sig_im,"state_sig_im",64);
    while(1){
    ...//setting state_out
     ShmemSendInt(state_sig_im,state_out);
    }
    return 0;
    }
    //end of main.c of processA -- sender
    =====================================
    //main.c of processB & C -- receiver
    ...
     Shmem *state_sig_im;
     int state_in;

    int _tmain(int argc, _TCHAR* argv[]){
    state_sig_im = (struct shmem*)malloc( sizeof(struct shmem) );
     ShmemInit(state_sig_im,"state_sig_im",64);
    while(1){
    ...//setting state_out
     ShmemSendInt(state_sig_im,state_in);
     while(!should_quit){
      ShmemReceiveInt(state_sig_im,&state_in);
      printf("received: %d\n",state_in);
      Sleep(1000);//sleep for 1 sec
     }//end of while(1){
    return 0;
    }

    2010年1月4日 4:35

回答

  • すみません、またまた質問者です。
    問題は解決しました。
    LPCSTRとLPCWSTRはコンパチではない云々の警告を受けていたのですが、
    ProcessCではマルチバイト対応になっていなかったようです。
    設定を適切にして、警告を全て消したら動きました!
    どうもありがとうございました。お騒がせいたしました。
    • 回答としてマーク yneedshelp 2010年1月4日 5:59
    2010年1月4日 5:58

すべての返信

  • すみません。質問者です。
    参考までに成功時の出力は:
    constructing shared memory
    received: -1
    received: -1
    received: 0
    received: 1
    received: 3
    received: 3
    received: 5
    received: 6
    received: 7
    received: 8
    received: 8
    ・・・

    失敗時は:
    constructing shared memory
    received: 0
    received: 0
    received: 0
    received: 0
    received: 0
    ・・・
    と0となってしまいます。
    0を受けるときは、タグなどが違うので共有メモリにアクセス出来ていないケースだと思うのですが…

    何が問題だと思われるでしょうか?ご助力願えれば幸いです。

    2010年1月4日 4:45
  • すみません、またまた質問者です。
    問題は解決しました。
    LPCSTRとLPCWSTRはコンパチではない云々の警告を受けていたのですが、
    ProcessCではマルチバイト対応になっていなかったようです。
    設定を適切にして、警告を全て消したら動きました!
    どうもありがとうございました。お騒がせいたしました。
    • 回答としてマーク yneedshelp 2010年1月4日 5:59
    2010年1月4日 5:58