2017-12-29 21 views
0

共有メモリの実行をテストするプログラムを作成しました。C:共有メモリの奇妙なシンボル(UNIX)

  • 1つのプロセスが共有メモリを作成して書き込みます。
  • 他の読み取りから。

文字列を印刷する以外は、完全に機能します。

まずプログラム:

#define mykey 12345 
#define perms 0666 

struct pdata{ 
    int ppid; 
    char ptype; 
    char *pname; 
    unsigned long pgenome; 
}; 

int main(int argc, char **argv){ 

    int shmid; 
    char *args[] = {"test2", NULL}; 
    struct pdata *ap; 
    struct pdata p0={12, 'A', "PIPPO", 100}; 
    shmid = shmget(mykey, sizeof(struct pdata) * 1, perms | IPC_CREAT | IPC_EXCL); 
    ap = (struct pdata*) shmat(shmid, NULL, 0); 
    ap[0] = p0; 

    printf("%s\n", ap[0].pname); 
    if(execve("test2", args, NULL) == -1){ 
     printf("Errore execve\n"); 
    } 

    shmdt(ap); 
    shmctl(shmid, IPC_RMID, 0); 

    return 0; 
} 

第二プログラム:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <unistd.h> 
#include <sys/types.h> 
#include <sys/wait.h> 
#include <sys/ipc.h> 
#include <sys/msg.h> 
#include <sys/sem.h> 
#include <sys/shm.h> 
#include <sys/stat.h> 
#include <fcntl.h> 
#include <stdarg.h> 
#include <errno.h> 
#include <time.h> 

#define mykey 12345 
#define perms 0666 

struct pdata{ 
    int ppid; 
    char ptype; 
    char *pname; 
    unsigned long pgenome; 
}; 

int main(){ 

    int shmid = shmget(mykey, sizeof(struct pdata) * 1, perms); 
    struct pdata *ap; 
    ap = (struct pdata*) shmat(shmid, NULL, 0); 
    printf(
     "ap[0].ppid=%d\nap[0].ptype=%c\nap[0].pname=%s\nap[0].pgenome=%lu\n", 
     ap[0].ppid, 
     ap[0].ptype, 
     ap[0].pname, 
     ap[0].pgenome 
    ); 

    shmdt(ap); 
    shmctl(shmid, IPC_RMID, 0); 

    return 0; 
} 
+0

そして**正確に**あなたの質問は何ですか? – jwpfox

+0

問題は共有メモリ内の文字列をどうやって共有できるかということです。例えば、構造体 – Stewe

答えて

6

それは共有メモリにポインタを置く意味がありません。受信プロセスは、他のプロセスのメモリ空間内の文字列のアドレスを知るようになりましたが、それは何の役にも立ちません。その代わりに、文字列自体を共有メモリに入れてください。例えば

、変更:

char *pname; 

へ:

char pname[512]; 

、適切にあなたのプログラムの残りの部分を調整します。

+0

の文字列pnameを使ったこの例では、私は試してみましたが、うまくいきましたが、なぜまだその理由が分かりませんでした。だから私はpname文字列の文字の最大数を与えるつもりです。 – Stewe

関連する問題