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

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

#include  #include  #include  int main() { int fd,len=1024*1024; fd=open("hello",O_READ); char*addr=mmap(0,len,PROT_READ+PROT_WRITE,MAP_SHARED,fd,0); for(fd=0;fd<len;fd++) putchar(addr[fd]); if (addr==MAP_FAILED) {perror("mmap"); exit(1);} printf("mmap returned %p, which seems readable and writable\n",addr); munmap(addr,len); return 0; } 

Но я не могу выполнить эту программу, что-то не так с моим кодом?

Прежде всего, код даже не будет компилироваться в моем поле debian. Насколько я знаю, O_READ не является правильным флагом для open ().

Затем вы сначала используете fd в качестве дескриптора файла, а вы используете его в качестве счетчика в цикле for.

Я не понимаю, что вы пытаетесь сделать, но я думаю, вы неправильно поняли что-то о mmap .

mmap используется для отображения файла в память, таким образом вы можете читать / записывать в созданное сопоставление памяти вместо использования функций для доступа к файлу.

Вот короткая программа, которая открывает файл, отображает его в памяти и печатает указатель возврата:

 #include  #include  #include  #include  #include  #include  int main() { int fd; int result; int len = 1024 * 1024; fd = open("hello",O_RDWR | O_CREAT | O_TRUNC, (mode_t) 0600); // stretch the file to the wanted length, writting something at the end is mandatory result = lseek(fd, len - 1, SEEK_SET); if(result == -1) { perror("lseek"); exit(1); } result = write(fd, "", 1); if(result == -1) { perror("write"); exit(1); } char*addr = mmap(0, len, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); if (addr==MAP_FAILED) { perror("mmap"); exit(1); } printf("mmap returned %p, which seems readable and writable\n",addr); result = munmap(addr, len); if (result == -1) { perror("munmap"); exit(1); } close(fd); return 0; } 

Я отказался от цикла for, так как не понял ее цели. Поскольку вы создаете файл и хотите его сопоставить по заданной длине, мы также должны «растянуть» файл до заданной длины.

Надеюсь это поможет.