Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Разбираю пример mmap() UNIX


Автор: adom 13.4.2009, 10:58
Пример с комментариями здесь http://cs.mipt.ru/docs/courses/osstud/11/stud/11-1c.htm
В кратце так:
Код

struct A {
double f;
double f2;
} *ptr, *tmpptr;
...
ptr = (struct A *)mmap(NULL, length, PROT_WRITE | PROT_READ, MAP_SHARED, fd, 0);
...
tmpptr = ptr;
for(i = 1; i <=100000; i++){
tmpptr->f = i;
tmpptr->f2 = tmpptr->f*tmpptr->f;
tmpptr++;
}
munmap((void *)ptr, length);

Файл создаётся, но в нём вместо чисел и их квадратов что-то вроде этого
р?р?@@"@@0@@9@@B@@ЂH@ @P@"@@T@$@Y@&@@^@(@b@*@ e@,@Ђh@.@ l@0@p@1@r@2@@t@3@ђv@4@y@5@ђ{@6@@~@7@€Ђ@8@‚@9@€ѓ@:@ …@;@И†@<@Ђ€@=@HЉ@>@ Њ@?Ћ@@@ђ@Ђ@@‘@A@’@ЂA@$“@B@@”@ЂB@d•@C@ђ–@ЂC@Д—

Автор: andrew_121 13.4.2009, 11:01
adom, Во первых: ты для какой ОС пишешь?
Во вторых: Показывай весь код. Многое сокрыто.

Автор: adom 13.4.2009, 11:46
Цитата(andrew_121 @ 13.4.2009,  11:01)
adom, Во первых: ты для какой ОС пишешь?
Во вторых: Показывай весь код. Многое сокрыто.

Я разбираю пример, который соответствует стандарту и идёт на любой UNIX подобной ОС, то есть соответствующей стандарту (забыл как сейчас POSIX называется). Полный код с комментариями по указанной ссылке.
По теме: разобрался, я писал в файл данные в двоичном виде, чтобы были "буковки" можно через sprintf это делать, например так
Код

#include <unistd.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <stdio.h>
int main(void)
{

int fd; /* Файловый дескриптор для файла, в котором будет храниться наша информация*/
size_t length; /* Длина отображаемой части файла */
int i;
char str[]="Hello world\n", *ptr, *tmpptr;
printf(str);
fd = open("mapped.dat", O_RDWR | O_CREAT, 0666);
if( fd == -1){
printf("File open failed!\n");
exit(1);
}
length = sizeof(str);
ftruncate(fd,length);
ptr = (char *)mmap(NULL, length, PROT_WRITE | PROT_READ, MAP_SHARED, fd, 0);
close(fd);
if( ptr == MAP_FAILED ){
printf("Mapping failed!\n");
exit(2);
}
//tmpptr = ptr;
//tmpptr = str;
sprintf ((char*)ptr,str);
/*
for(i = 1; i <=100; i++){
tmpptr->f = i;
tmpptr->f2 = tmpptr->f*tmpptr->f;
tmpptr++;
}
*/
munmap((void *)ptr, length);
return 0;
}


Автор: andrew_121 13.4.2009, 11:52
adom, Если вопрос решён, пометь тему "решённой".

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)