Comment lire et écrire avec mmap() sur un système Linux
J'ai besoin de faire certains flux dans et hors classes à l'aide de mmap() sous Linux. Pour ce faire, j'ai essayé de faire quelques test de code qui écrit des nombres entiers dans un fichier, enregistre, il se charge encore et écrire les données dans le fichier de cout. Si ce test de code fonctionne, Il ne sera pas un problème de flux et de sortir par la suite.
Quand j'ai commencé j'ai eu segment de fautes et Si je ne comprends pas que rien ne s'est passé, alors j'ai googlé un peu. J'ai trouvé ce livre http://www.advancedlinuxprogramming.com/alp-folder/alp-ch05-ipc.pdf où autour de la page 107 il y a quelques utile de code. J'ai copier collé le code et fait quelques petits changements et a obtenu ce code:
int fd;
void* file_memory;
/* Prepare a file large enough to hold an unsigned integer. */
fd = open ("mapTester", O_RDWR | O_CREAT, S_IRUSR | S_IWUSR);
//Make the file big enough
lseek (fd, 4 * 10 + 1, SEEK_SET);
write (fd, "", 1);
lseek (fd, 0, SEEK_SET);
/* Create the memory mapping. */
file_memory = mmap (0, 4 * 10, PROT_WRITE, MAP_SHARED, fd, 0);
close (fd);
/* Write a random integer to memory-mapped area. */
sprintf((char*) file_memory, "%d\n", 22);
/* Release the memory (unnecessary because the program exits). */
munmap (file_memory, 4 * 10);
cout << "Mark" << endl;
//Start the part where I read from the file
int integer;
/* Open the file. */
fd = open (argv[1], O_RDWR, S_IRUSR | S_IWUSR);
/* Create the memory mapping. */
file_memory = mmap (0, 4 * 10, PROT_READ | PROT_WRITE,
MAP_SHARED, fd, 0);
close (fd);
/* Read the integer, print it out, and double it. */
scanf ((char *) file_memory, "%d", &integer);
printf ("value: %d\n", integer);
sprintf ((char*) file_memory, "%d\n", 2 * integer);
/* Release the memory (unnecessary because the program exits). */
munmap (file_memory, 4 * 10);
Mais je reçois un segment fults après la "marque" de cout.
Puis-je remplacer le "lire la suite" avec ceci:
fd = open("mapTester", O_RDONLY);
int* buffer = (int*) malloc (4*10);
read(fd, buffer, 4 * 10);
for(int i = 0; i < 1; i++)
{
cout << buffer[i] << endl;
}
Qui est un peu de code de travail qui m'indique que le fichier est vide. Je tente un couple de façons d'écrire à la cartographie sans aucun changement dans le résultat.
Alors, comment suis-je introductif de faire mon code à écrire?
Et mon mmap lire le code semble correct (juste au cas où vous pouvez voir quelques défauts évidents)?
J'ai trouvé quelques autres ressources qui ne m'aide pas, mais parce que je suis un nouvel utilisateur je ne peut poster max 2 liens.
OriginalL'auteur RobbingDaHood | 2012-02-13
Vous devez vous connecter pour publier un commentaire.
Vous devriez tester le résultat de mmap. Si elle donne
MAP_FAILED
découvrez errno pour savoir pourquoi.Et vous aurez une meilleure mmap un multiple de pages, souvent 4K octets chacun, et donné par sysconf(_SC_PAGESIZE)
Vous pouvez utiliser stat pour savoir la taille de l' (et beaucoup d'autres numéros sur) certains fichier donné.
Vous pouvez utiliser
strace
sur Linux existantes des programmes pour apprendre ce que les appels qu'ils font.Voir aussi cette sur
/proc/
etc.OriginalL'auteur Basile Starynkevitch
Votre
scanf()
appel doit êtresscanf()
, et la seconde doit utiliser"mapTester"
au lieu deargv[1]
que le nom de fichier. Quand j'ai corrigé ces bugs, votre posté programme de travaux (impression22
et en laissant44
dans le fichier).Bon je ne peux pas ajouter plus de code, parce que c'est long. J'ai copié le code que j'ai écrit ici et modifié le 2 places et il est venu avec une erreur de segmentation dans la dernière partie du code. Mais merci pour les 2 bonne sugestion, très utile 🙂
OriginalL'auteur caf