2010-10-29 9 views
1

Je crée donc un fichier Load.c, qui va charger un groupe d'étudiants dans la mémoire partagée. Les étudiants sont stockés dans une struct qui ressemble à ceci:Charger la mémoire partagée dans C

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

Quoi qu'il en soit, je dois charger cette mémoire partagée. On nous a donné quelques exemples de code et nous lisons le code à partir d'un fichier de données qui ressemblera à ceci:

John Blakeman 

111223333 

560 Southbrook Dr. Lexington, KY 40522 

8591112222 

Paul S Blair 

111223344 

3197 Trinity Rd. Lexington, KY 40533 

etc.... 

Voici mon idée du code: (header.h vient informations struct/et sémaphores mang .. ..I'm incertain de ce qu'il doit être, en ce moment il est étiqueté comme 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 

C'est à peu près aussi loin que je suis arrivé. maintenant je sais que je peux stocker des données en utilisant strcpy (infoptr-> fName, "Joe"); (par exemple) mais j'ai besoin de lire un nombre X de noms? Comment pourrais-je les stocker? En utilisant une sorte de vecteur push/pop de structures? à quoi cela ressemblerait-il?

Et puis-je ajuster les sémaphores en fonction du nombre d'entrées que je suppose? Je suis un peu confus comment ajuster mon nombre de sémaphores.

Oh BTW est ici mon fichier d'en-tête juste au cas où (SSN sont faux évidemment)

/* 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); 
+0

Hm, je ne comprends pas quels sont vos objectifs. Pourriez-vous nous donner peut-être une idée de la mission? –

+0

duplication possible de [C base de données de mémoire partagée] (http://stackoverflow.com/questions/4048516/c-shared-memory-database) –

+0

^^ C'est à partir de cette assignation oui, mais c'est un fichier spécifique. Je vais accéder à la mémoire partagée à partir d'autres programmes (print.c et query.c) Dans ce je vais juste les charger dans la mémoire partagée. Le principal problème est que je n'ai aucune idée de la durée du fichier de données. –

Répondre

0

Uhm ... Je ne suis pas sûr, mais ce que je compris:

Vous » re chargement struct StudentInfo blocs dans un espace mémoire partagée, et vous voulez être en mesure d'y accéder à partir d'autres processus?

D'abord, considérez que votre structure est de taille fixe. Si vous voulez lire 10 noms, vous devez obtenir sizeof(struct StudentInfo) * 10 octets, si vous voulez 400, faites * 400 - donc vous n'avez pas besoin de pousser et d'éjecter vos élèves de n'importe quelle file d'attente, puisque vous pouvez juste utiliser les maths pour calculer d'où et jusqu'à où vous avez besoin de lire. Obtenir les étudiants de 10 à 20 est en train de lire l'espace de mémoire partagée de sizeof(struct StudentInfo) * 10 à sizeof(struct StudentInfo) * 10

En ce qui concerne l'exclusion mutuelle (si vous allez avoir plusieurs lecteurs ou écrivains, que je suppose, est ce que vous vouliez les sémaphores pour), je ne recommande pas les sémaphores. Ils sont adéquats pour des types d'exclusion plus simples, comme «N'utilisez pas cette fonction si je l'utilise», mais pas pour verrouiller de gros ensembles de données. J'ai besoin de file locking. Sous Unix, vous pouvez utiliser file locking primitives pour créer des verrous de consultation sur des octets spécifiques dans un fichier, même si le fichier a une longueur de 0 octet. Qu'est-ce que ça veut dire? L'avertissement signifie que vous ne les appliquez pas, d'autres processus doivent les respecter volontairement. 0-byte-long signifie que vous pouvez ouvrir un fichier qui n'existe pas, et verrouiller des parties de celui-ci correspondant à vos positions de structure d'étudiant dans la mémoire partagée. Vous n'avez pas besoin du fichier pour réellement avoir des données, vous pouvez l'utiliser pour représenter votre base de données de mémoire partagée sans rien y écrire.

Quel est l'avantage de ceci sur les sémaphores? Vous avez un contrôle précis de vos serrures avec un seul descripteur de fichier!

Wheh, ça a été long. J'espère que j'ai aidé.

+0

Je pense que pour la mission, nous devons utiliser des sephamores. et oui vous avez aidé beaucoup! Aussi, comment puis-je décider combien de septas à utiliser. –

+0

Eh bien, cela dépend de la précision de votre mécanisme de verrouillage. Vous pouvez utiliser un sémaphore unique pour verrouiller toute la base de données, ou autant de sémaphores que les entrées que vous avez si vous voulez les verrouiller séparément. Gardez cependant à l'esprit que les sémaphores ne sont pas infinis et que si vous implémentez plusieurs verrous, vous devrez synchroniser leur acquisition et leur libération pour les opérations impliquant plusieurs entrées. – slezica

+0

Hmm bien je sais que je dois assurer une exclusion mutuelle entre lecteurs et écrivains. et je sais aussi que plusieurs étudiants/conseillers accéderont à cette base de données, j'ai donc besoin de synchroniser l'accès simultané puisque plusieurs lecteurs et rédacteurs y auront accès. Cependant, je ne sais pas combien de séphamores cela signifie que je vais avoir besoin depuis que nous venons de commencer à apprendre sur ce genre de choses. –

Questions connexes