2015-02-08 72 views
0

我想分享我的C服务器上的一个结构的记忆,得到了下面的代码交流电插座/客户端fork()的,共享内存结构

// Before the main 
struct Esami { 
    char nome[20]; 
    char cognome[20]; 
    char matricola[20]; 
    char voto[20]; 
}; 

struct Appelli { 
    int stato; 
    char dipartimento[20]; 
    char cdl[20]; 
    char nomeEsame[20]; 
    char data[20]; 
    struct Esami esame[10]; 
    int numEsamiRegistrati; 
} *appello[100]; 

这是我在我的叉子做:

// After creating socket, bind(), listen() and so on.. 
if ((pid = fork()) == 0) { 
    shmid = shmget(2009, sizeof(appello), 0666 | IPC_CREAT); 
    *appello = shmat(shmid, 0, 0); 
    close (listenfd); // Closes the parent socket 
    // Operations on this struct (like the one I explained below) 
    exit(0); 
} 

我尝试使用箭头操作符来访问该结构的领域,但该计划可能得到一个内存错误,所以如果我填充字段,然后重例如

printf("Dipartimento: %s", appello[0]-> dipartimento); 

服务器程序崩溃:来自客户端的其他每个输入都不会被读取。我设法使用单个结构变量(如* appello)来处理它,但是一旦我开始使用数组(* appello [100]),我就会遇到这个问题。

问题是:如何将此数组结构的内存段共享给连接到服务器的每个客户端?

请注意,我试图了解大学的练习,我必须用共享内存和分叉解决它。

+0

为什么你不在串口上(serialize)(http://en.wikipedia.org/wiki/Serialization)你的数据结构?另请参阅[这个答案](http://stackoverflow.com/a/28373401/841108)到一个相关的问题... – 2015-02-08 19:46:07

回答

1

首先只是在你的榜样评论:

`printf("Dipartimento: %s", appello[0]-> dipartimento);`  
this space does not belong in any form^ 

注:,为下面的评论,我没有你的struct成员struct Esami esame[10];的定义,所以不得不简化所有插图中结构的表示。

下一点,对于一个不同的方法,改变的图示:

struct Appelli { 
    int stato; 
    .... 
    int numEsamiRegistrati; 
} *appello[100]; 

typedef struct { 
    int stato; 
    .... 
    int numEsamiRegistrati; 
} APPELLO; 
APPELLO appello[100], *pAppello; 

在main()(或在任何执行代码的能部)执行该初始化:

pAppello, = &appello[0];//initializes your pointer to a copy of struct 
pAppello = malloc(sizeof(APPELLO)); 

然后,使用指针时,基准构件是这样的:

pAppello->cdl;//use -> for pointer 

当使用数组,这样的参考成员:

appello[0].cdl;//use . for non-pointer 

如果你想要一个数组指针,则初始化是不同的:

pAppello = &appello[0];//initializes your pointer to a copy of struct 
pAppello = malloc(sizeof(APPELLO)*100); //provides 100 instances of pAppello 

现在,你有一个指针数组的结构,并再次将 使用.访问其成员:

pAppello[0].cdl; 

对于这里的其他阅读是一个很好的tutorial on C structures

+0

感谢您的亲切的答案,我更新了我的问题结构“Esame”,但从你的代码我仍然不明白,如果我正确地分配内存段,以共享所有分叉进程之间的结构 – wiredmark 2015-02-09 09:57:13

+0

@wiredmark - 您是否已阅读并理解此*** [page](http:// linux。 die.net/man/2/shmat)***?这是关键:_成功的shmat()调用更新shmid_ds structure_的成员。这个结构已经定义好了,但是你已经创建了自己的结构。 – ryyker 2015-02-09 15:11:22

+0

***关于你的记忆问题*** - 我不确定我是否理解,但我会尝试一下:通过创建一个指向“APPELLO”的指针数组,你应该能够使用每个实例来存储您创建的每个流程。在这个例子中,我们创建了一个100的数组,因此您应该能够存储多达100个不同进程的信息。第一个进程为'pAppello [0] .cdl;',第二个进程为'pAppello [1] .cdl;',第100个进程为'pAppello [99] .cdl;'。 – ryyker 2015-02-09 15:15:27