2015-05-04 58 views
4

我正在嘗試將文件映射到OS X的虛擬內存管理器。我如何使用Objective C在Mac OS X上執行此操作?如何將文件映射到OSX中的虛擬內存管理器?

+0

我編輯了你的問題的'壞'部分,我們仍然錯過了你想要做什麼的語言。 –

+0

我在對象C和C++中編程。 – user3275597

+1

您可以將'C'與'Objective-C'一起使用。您可以使用[mmap] https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man2/mmap.2.html –

回答

1

使用mmap。例如

FILE* f = fopen(...); 

// Map the file into memory. 

// Need the file size. 
fseek(f, 0, SEEK_END); // seek to end of file 
off_t fileSize = ftello(f); // get current file pointer 
fseek(f, 0, SEEK_SET); // seek back to beginning of file 
mappedSize = fileSize; 

mappedAddress = mmap(0, _mappedSize, PROT_READ, MAP_PRIVATE, f->_file, 0); 

... use mappedAddress as a pointer to your data 

// Finally free up 
munmap(_mappedAddress, _mappedSize); 
fclose(f); 
+1

使用'fileno()'而不是訪問'FILE'結構的實現細節。對於這個問題,最好使用'open()','lseek()'和'close()'。 –

1

當然使用mmap()的作品。考慮到您使用Cocoa,另一種選擇是使用NSDataNSMutableData。您可以在選項中使用-initWithContentsOfURL:options:error:NSDataReadingMappedIfSafeNSDataReadingMappedAlways創建數據對象。有兩個不同的選項,因爲映射文件不一定安全。如果文件位於可能自發消失的文件系統上(網絡文件系統,可移動驅動器),則將其映射會導致應用程序崩潰。如果這種情況不太可能發生,前一種選擇只能進行映射。否則,它會將數據讀入內存。後面的選項總是會映射出來,留給你來應付崩潰的可能性。

相關問題