2015-10-08 2 views
0
#include <stdio.h>  /* fprintf */ 
#include <stdlib.h>  /* exit */ 
#include <string.h>  /* memset */ 
#include <sys/mman.h>  /* mmap */ 
#include <sys/types.h>  /* pthread types */ 
#include <sys/stat.h>  /* fchmod */ 
#include <pthread.h>  /* thread primitives */ 
#include <fcntl.h>  /* open */ 
#include <unistd.h>  /* ftruncate */ 
#include <errno.h>  /* errno */ 

#define LIB_ADDR 0xaabbccdd /* memorable random address */ 

#define UNMAP_FILE "unmapfile" 
#define PAGE_SIZE 1024 
#define DIE(msg)    \ 
    printf("-----\nDIE:%s\n-----\n", msg) 

int 
main(int argc, char **argv) 
{ 
    int err; 
    int unmap_fd; 

    unmap_fd = open(UNMAP_FILE, O_RDWR | O_CREAT); 
    if (unmap_fd < 0) DIE("open of unmap file failed"); 

    err = ftruncate(unmap_fd, PAGE_SIZE); 
    if (err) DIE("ftruncate unmap file to page size failed"); 

    err = mmap((void *)LIB_ADDR + PAGE_SIZE, PAGE_SIZE, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_FIXED, unmap_fd, 0); 
    if (err = MAP_FAILED) DIE("mmap of to-be-unmapped page failed"); 

    return 0; 
} 

Что я делаю, довольно просто. Я просто хочу, чтобы файл mmap на фиксированный адрес, но я получаю ошибку mmap of to-be-unmapped page failed. Я проверил все, но до сих пор не знаю.Недопустимый аргумент в mmap

+2

'err = MAP_FAILED' должно быть' err == MAP_FAILED'? – immibis

+1

'=' используется для назначения значения справа налево. используйте '==' для сравнения. 'if (err == MAP_FAILED)' – Himanshu

+0

Pro tip: включение предупреждений компилятора (например, 'gcc -Wall ...') сделало бы эту ошибку сразу очевидной - всегда компилируйте с включенными предупреждениями и не игнорируйте такие предупреждения! –

ответ

2

Этот

if (err = MAP_FAILED) DIE("mmap of to-be-unmapped page failed"); 

должен быть

if (err == MAP_FAILED) DIE("mmap of to-be-unmapped page failed"); 
//Notice the == 

Вы просто назначая здесь, и это делает условие истинно.

mmap(2) возвращает void*. Таким образом, тип err также неверен. Объявите новый указатель на пустоту и используйте его:

void *mptr; 
.... 
.... 

mptr = mmap((void *)LIB_ADDR + PAGE_SIZE, PAGE_SIZE, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_FIXED, unmap_fd, 0); 
if (mptr == MAP_FAILED) DIE("mmap of to-be-unmapped page failed"); 
+0

Спасибо за ваше уведомление. Я изменил все изменения, как вы предложили. Но та же проблема все еще остается. – HuangJie

+0

Осмотрите 'errno' после вызовов' ftruncate' и 'mmap' и посмотрите, что он говорит. –

+0

Я изменил его на 'if (mptr == MAP_FAILED) {perror (" mmap "); fprintf (stderr, "Whoops");} ', чтобы я мог проверить. И он печатает 'mmap: invalid argumnet'. – HuangJie

Смежные вопросы