我得到分段錯誤,當我運行下面的一段代碼...爲什麼不MMAP這裏工作
int * x = mmap(0, 4096, PROT_READ | PROT_WRITE, MAP_PRIVATE, 0, 0);
x[0] = 42; // <--- Segmentation fault happens due to this
這裏有什麼問題?
我得到分段錯誤,當我運行下面的一段代碼...爲什麼不MMAP這裏工作
int * x = mmap(0, 4096, PROT_READ | PROT_WRITE, MAP_PRIVATE, 0, 0);
x[0] = 42; // <--- Segmentation fault happens due to this
這裏有什麼問題?
好的,我明白了。我忘了把MAP_ANONYMOUS,所以它應該一直是這樣的...
int * x = mmap(0, 4096, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE,
0, 0);
其以這種方式工作。
指定fd爲-1。在linux中,當指定MAP_ANONYMOUS時,fd被忽略。但是一些unix實現需要它。便攜式應用程序應將fd傳遞爲-1。 – JagsVG
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
與否。可能是這樣的。
您指定了錯誤的標誌和文件描述符。它看起來像你想要的是一個匿名(不受文件支持)映射。如果是這樣的話,正確的調用是:
x = mmap(0, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
您需要使用MAP_ANONYMOUS
標誌,告訴Linux的沒有文件。你應該通過-1
的文件描述符,不是0
是的你是對的,正如我在我的回答中已經提到的那樣:-p! – MetallicPriest
,您應經常檢查的mmap
結果不是MAP_FAILED
(即(void *) -1
),並使用errno
得到在這種情況下錯誤代碼。
您的mmap
可能會失敗(例如,由於資源限制設置爲setrlimit,或者因爲交換空間已滿)。
您是否檢查過對mmap的調用是否成功? – Tudor
文件描述符0(最後一個參數)是一個字符設備。也許你想要-1? – wildplasser