2010-05-12 4 views
6

메모리를 파일 디스크립터에 매핑 할 수 있기 때문에 파일 디스크립터가 필요한 기존의 일부 기능을 사용할 수 있습니다. 본질적으로 내가 원하는 것은 다음과 같습니다.메모리를 파일 디스크립터에 매핑하는 시스템 호출 (역방향 mmap)?

void do_operation1(int fd); 

char data[DATA_MAX] = { /* embedded binary data */ }; 
int fd = addr_to_fd(data, DATA_MAX); 

do_operation1(fd); 
/* ... operate on fd ... */ 

어떤 시스템 호출 또는 호출을 사용하여이 작업을 수행 할 수 있습니까?

답변

3

shm_open()을 확인해야합니다.

7

일부 구현은 입니다. (물론 당신은 fileno()로 전화해야합니다).

귀하가 원하지 않는 경우 fork()pipe()으로 직접 제작할 수 있습니다.

+1

'FILE *'이'fmemopen '또는 그와 동등한 것에서'fileno()'가 리눅스/FreeBSD (그리고 다른 것들을 추측합니다)에서 실패한다는 것이 밝혀졌습니다. 파일 설명자를 얻을 수있는 방법이 없으면 해결책이 있는지 확신 할 수 없습니다. –

+1

'fmemopen' 또한 BSD에서'funopen '을 사용하여 구현 될 수 있습니다. 하나의 구현은 https://redmine.openinfosecfoundation.org/attachments/105/0001-fmemopen-wrapper-added-fix-compilation-problems-on-m.patch –

+0

에서 사용할 수 있습니다.'fork()'는 이 목적. 대신 스레드를 사용하는 것이 좋습니다. 파이프에서 읽기와 쓰기 사이의 다중화에'select() '를 사용하는 것이 더 좋을지 모르지만, 여기서는 옵션이 아닌 것 같습니다. – Sven

2

확실한 것은 open(argv[0], ...)입니다. 파일을 스캔하여 이진 데이터가있는 곳을 찾고 lseek()이 완료되었습니다. 그 파일은 당연히 바이너리 데이터의 길이를 가지지 않을 것입니다.