2015-02-08 2 views
0

Я пытаюсь разделить память о структурах на моем C сервере, получила следующий кодC Socket/Client вилка(), доля структура память

// 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]), я получаю эту проблему.

Вопрос: как я могу совместно использовать сегмент памяти этого массива структуры для каждого клиента, подключающегося к серверу?

Обратите внимание, что я пытаюсь понять университетское упражнение, и я должен решить его с разделяемой памятью и вилкой.

+0

Почему вы не сериализуете вашу структуру данных на сокете (http://en.wikipedia.org/wiki/Serialization)? См. Также [этот ответ] (http://stackoverflow.com/a/28373401/841108) к соответствующему вопросу ... –

ответ

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; 

В главном() (или в любом исполнении возможность раздел кода) выполнить эту инициализацию:

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», но из вашего кода I все еще не понимаю, правильно ли я назначил сегмент памяти, чтобы разделить эту структуру между всеми разветвленными процессами. – wiredmark

+0

@wiredmark. Вы читали и понимали содержимое этого *** [страницы] (http: // linux. die.net/man/2/shmat)***? Это ключ: _ Успешный вызов shmat() обновляет члены структуры shmid_ds_. Эта структура уже определена, но вы создали свою собственную. – ryyker

+0

*** Что касается вопроса о вашей памяти *** - Я не уверен, что понимаю, но я сделаю снимок: создав массив указателей на 'APPELLO', вы сможете использовать каждый экземпляр для хранения информации для каждый процесс, который вы создаете. В этом примере мы создали массив из 100, поэтому вы можете хранить информацию для до 100 различных процессов. 'pAppello [0] .cdl;' для первого процесса, 'pAppello [1] .cdl;' для второго процесса, весь путь через 'pAppello [99] .cdl;' для 100-го процесса. – ryyker

Смежные вопросы