2012-10-19 3 views
2

"file : ///path/path/file.ext"와 같은 파일 이름 URL을 사용하여 참조 할 수있는 파일에서만 작동 할 수있는 제 3 자 라이브러리가 있습니다. 그러나 나는 메모리에서 이미 읽고 싶은 데이터가있다.UNIX의 메모리 기반 파일

인 메모리 버퍼를 파일처럼 보이게 만들 수 있습니까? 즉, 파일 이름을 가지고 있기 때문에 써드 파티 라이브러리가 디스크를 처리 할 수 ​​있도록 쓰기 메모리 버퍼를 남겨 둘 수 있습니까?

감사

편집 : 그것은 나중에 이름으로 참조 할 수 있도록 파일을 만드는 것)

const char* gFileName = "/Users/matthew.davies/Hello"; 

void MakeMemoryFile (const char* filename, const char* buffer, size_t size) 
{ 

} 

void DeleteMemoryFile (const char* filename) 
{ 

} 

int main() 
{ 
    const char* buffer = "Hello World!"; 
    FILE* f; 
    char outBuffer [13]; 


    MakeMemoryFile(gFileName, buffer, strlen(buffer)); 

    f = fopen(gFileName, "rb"); 
    outBuffer[12] = 0; 
    fread(outBuffer, 12, 1, f); 
    fclose(f); 
    DeleteMemoryFile(gFileName); 

    return 0; 
} 

MakeMemoryFile을 (: 나는 내가하고 싶은 것을 보여주는 몇 가지 코드를 추가 한 fopen.

+0

스크립트에서 데이터를 가져 오는 문자 장치를 만들 수 있습니다. Perl과 같은 것을 만들 수 있다는 것을 알고 있습니다. –

답변

0

OS와 같이 유닉스 인 경우 mmap() 시스템 호출을 사용하여 메모리 맵핑 된 파일을 사용하는 것이 어떻습니까?

+0

파일 이름으로 참조 할 수 있어야합니다. – Cthutu

+0

mmap() 매개 변수로 파일과 관련된 파일 설명자를 지정할 수 있으며 mmap에서 가져온 포인터를 "buffer"로 사용할 수 있습니다. –

+0

하지만 fopen()을 사용하여 해당 버퍼를 "열 수 있습니까?" 타사 라이브러리에는 파일 이름이 필요합니다. 파일 이름을 통해 내 메모리 버퍼에만 액세스 할 수 있어야합니다. – Cthutu

0

mmap() 버퍼에 tmpfs (메모리 임시 파일 시스템)을 만들고 가능한 첫 번째 단계는 루트 권한이 필요하지만이 시나리오는 조금 지나치게 복잡합니다.

또 다른 가능한 접근법은 일부 프로그램의 메모리 영역을 파일로 노출시키는 작은 사용자 정의 FUSE 파일 시스템을 사용하는 것입니다 (이 FS를 프로그램에 통합하고 프로그램의 종속성에 FUSE를 추가해야 함).

또한 Linux는 공격적인 디스크 캐싱을 수행하므로 매우 큰 파일이 아니라면 커널에 남겨 두는 것이 좋습니다. 예를 들어 Vim은 명시 적 캐싱없이 큰 태그 파일 (~ 100MB)을 잘 처리합니다.

+0

불행히도, 이것은 iOS 운영체제가 AVFoundation이 파일 이름을 필요로하는 문제를 해결하는 것입니다. 그러나 이미 메모리에 데이터가 있습니다. – Cthutu