Адрес памяти печати, отображение

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

#include <stdio.h>
#include <fcntl.h>
#include <string.h>
#include <sys/mman.h>
#include <stdlib.h>

int main(int argc, char **argv){

  if(argc>=3){

    int fd;
    const char *fname=argv[1];
    const char *str=argv[2];


    if((fd=open(fname,O_CREAT|O_RDWR,0))!=-1){

       int *startaddress = malloc(strlen(str)*sizeof(char));
       mmap(startaddress, strlen(str)*sizeof(char), PROT_READ|PROT_WRITE,        MAP_SHARED, fd, 0);

       write(fd,str,strlen(str));

       printf("File address: %d\n",fd);
       printf("Suggested file address: %p", startaddress);
       close(fd);
       free(startaddress);
     }

   }else
   printf("You didn't enter a proper number of arguments.\n");

}

person Raghad    schedule 22.10.2015    source источник
comment
Если он не печатает никаких сообщений, попробуйте добавить \n (например, printf("Suggested file address: %p\n", startaddress); или добавить fflush(stdout); после печати. ​​В противном случае проверьте, что startaddress != NULL. (Ps: вы должны получить вывод mmap() в каком-либо другом указателе - присвоение адреса mmap() - это просто подсказка)   -  person maddouri    schedule 22.10.2015
comment
@ 865719 Теперь я получаю вывод. Почему mmap не использует предоставленную мной память?   -  person Raghad    schedule 22.10.2015
comment
Как упоминалось в руководстве, это подсказка: Если addr не равен NULL, тогда ядро ​​воспринимает это как подсказку о том, где разместить отображение; в Linux сопоставление будет создано на границе соседней страницы. В результате вызова возвращается адрес нового сопоставления.   -  person maddouri    schedule 22.10.2015
comment
Другими словами: указанный вами адрес является началом уже malloc()ated пробела, mmap() не может просто использовать его. Однако mmap() попытается сопоставить данные как можно ближе к блоку памяти, адрес которого вы указали.   -  person maddouri    schedule 22.10.2015
comment
Во-первых, каков ваш призыв к возвращению mmap()? Во-вторых, присвоение mmap() адреса в куче, такого как адрес, возвращенный malloc(), - хороший способ уничтожить вашу кучу - если ваше сопоставление будет успешным по этому адресу, это приведет к тому, что фактические страницы кучи будут отключены от адресного пространства процесса.   -  person Andrew Henle    schedule 22.10.2015


Ответы (1)


По умолчанию mmap принимает адрес, который вы ему даете, как подсказку, и отображает память как можно точнее. Чтобы заставить mmap выделяться точно в startaddress, должен быть предоставлен флаг MAP_FIXED.

Имейте в виду, что руководство не рекомендует использовать эту опцию, потому что это может вызвать повреждение памяти, если по этому адресу уже выделена память, или просто потерпеть неудачу. Кроме того, сопоставление не будет выполнено, если адрес не кратен getpagesize.

person mantal    schedule 21.01.2016