C Socket / Client fork(),共享struct memory

时间:2015-02-08 18:32:49

标签: c sockets struct fork shared-memory

我试图在我的C服务器上共享结构的内存,得到以下代码

// 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);

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

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

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

1 个答案:

答案 0 :(得分:1)

首先 只是对您的示例发表评论:

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

注意: ,对于下面的评论,我没有结构成员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