2011-12-12 66 views
1

我得到分段錯誤,當我運行下面的一段代碼...爲什麼不MMAP這裏工作

int * x = mmap(0, 4096, PROT_READ | PROT_WRITE, MAP_PRIVATE, 0, 0); 

x[0] = 42; // <--- Segmentation fault happens due to this 

這裏有什麼問題?

+1

您是否檢查過對mmap的調用是否成功? – Tudor

+1

文件描述符0(最後一個參數)是一個字符設備。也許你想要-1? – wildplasser

回答

1

好的,我明白了。我忘了把MAP_ANONYMOUS,所以它應該一直是這樣的...

int * x = mmap(0, 4096, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE, 
    0, 0); 

其以這種方式工作。

+2

指定fd爲-1。在linux中,當指定MAP_ANONYMOUS時,fd被忽略。但是一些unix實現需要它。便攜式應用程序應將fd傳遞爲-1。 – JagsVG

1

man mmap說:

On success, mmap() returns a pointer to the mapped area. On error, the value MAP_FAILED (that is, (void *) -1) is returned, and errno is set appropriately

檢查,是否x == MAP_FAILED與否。可能是這樣的。

9

您指定了錯誤的標誌和文件描述符。它看起來像你想要的是一個匿名(不受文件支持)映射。如果是這樣的話,正確的調用是:

x = mmap(0, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0); 

您需要使用MAP_ANONYMOUS標誌,告訴Linux的沒有文件。你應該通過-1的文件描述符,不是0

+0

是的你是對的,正如我在我的回答中已經提到的那樣:-p! – MetallicPriest

0

,您應經常檢查的mmap結果不是MAP_FAILED(即(void *) -1),並使用errno得到在這種情況下錯誤代碼。

您的mmap可能會失敗(例如,由於資源限制設置爲setrlimit,或者因爲交換空間已滿)。