Загрузите общую память в C - PullRequest
1 голос
/ 29 октября 2010

Итак, я делаю файл Load.c, который в основном загружает группу «студентов» в общую память. Студенты хранятся в структуре, которая выглядит следующим образом:

struct StudentInfo{
char fName[20];
char lName[20];
char telNumber[15];
char whoModified[10];
};

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

John Blakeman

111223333

560 Southbrook Dr. Lexington,  KY 40522

8591112222

Paul S Blair

111223344

3197 Trinity Rd. Lexington,  KY 40533

etc....

Вот моя идея для кода: (header.h просто имеет структуру info / и счетчик семафоров .... Я не уверен, каким он должен быть, сейчас он помечен как 5)

#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/sem.h>
#include "header.h"

main()
{   
    int i,id;
    struct StudentInfo *infoptr;
    int sema_set;

    id = shmget(KEY, SEGSIZE,IPC_CREAT|0666); /* get shared memory to store data */
    if (id < 0){
        perror("create: shmget failed");
        exit(1);
}

    infoptr=(struct StudentInfo *)shmat(id,0,0); /* attach the shared memory segment to the process's address space */

    if(infoptr <= (struct StudentInfo *) (0)) {
        perror("create: semget failed");
        exit(2);
    }

/* store data in shared memory segment */
//here's where I need help

Это примерно столько, сколько я получил. теперь я знаю, что могу хранить данные, используя strcpy (infoptr-> fName, "Joe"); (например) но мне нужно прочитать число имен X? Как мне их хранить? Используя какой-то вектор push / pop структур? как бы это выглядело?

И настраиваю ли я семафоры в зависимости от того, сколько "записей" я предполагаю? Я немного запутался, как настроить количество семафоров.

О, кстати, вот мой заголовочный файл на всякий случай (SSN явно фальшивый)

/* header.h */
#define KEY ((key_t)(10101)) /* Change to Last 5 digits of SSN */
#define SEGSIZE sizeof(struct StudentInfo)

#define NUM_SEMAPHS 5
#define SEMA_KEY ((key_t) (1010)) /* Last 4 digits of SSN */

struct StudentInfo{
char fName[20];
char lName[20];
char telNumber[15];
char whoModified[10];
};

void Wait(int semaph, int n);
void Signal(int semaph, int n);
int GetSemaphs(key_t k, int n);

1 Ответ

0 голосов
/ 29 октября 2010

Хм ... Я здесь не уверен, но вот что я понял:

Вы загружаете struct StudentInfo блоки в общую область памяти, и вы хотите иметь к ней доступиз других процессов?

Во-первых, учтите, что ваша структура имеет фиксированный размер.Если вы хотите прочитать 10 имен, вам нужно получить sizeof(struct StudentInfo) * 10 байт, если вы хотите 400, сделайте это * 400 - чтобы вам не нужно было выталкивать и извлекать ваших учеников из любой очереди, так как вы можетепросто используйте математику, чтобы вычислить, откуда и где вам нужно читать.Занятие учеников с 10 по 20 - это просто чтение пространства общей памяти от sizeof(struct StudentInfo) * 10 до sizeof(struct StudentInfo) * 10

Что касается взаимного исключения (если у вас будет несколько читателей или писателей, я полагаю, это то, что вы хотелисемафоры для), я не рекомендую семафоры.Они подходят для более простых видов исключения, таких как «не используйте эту функцию, если я ее использую», но не для блокировки больших наборов данных.

Я бы использовал file locking.В Unix вы можете использовать file locking primitives для создания консультативных блокировок для определенных байтов в файле, даже если файл имеет длину 0 байт.Что это значит?

Советы означают, что вы не применяете их, другие процессы должны охотно их уважать.Длина 0 байт означает, что вы можете открыть файл, который не существует, и заблокировать его части, соответствующие позициям структуры вашего студента в общей памяти.Вам не нужен файл для фактического хранения данных, вы можете использовать его для представления своей базы данных с общей памятью, ничего не записывая в нее.

В чем преимущество этого по сравнению с семафорами?У вас есть детальный контроль над вашими замками с помощью одного файлового дескриптора!

Вот как долго.Надеюсь, я помог.

...