2010-05-12 29 views
6

Tôi muốn có thể ánh xạ bộ nhớ đến một bộ mô tả tập tin để tôi có thể sử dụng một số chức năng hiện có cần một bộ mô tả tập tin. Đây là những gì tôi đang tìm kiếm:gọi hệ thống tới bộ nhớ bản đồ đến một bộ mô tả tệp (mmap ngược)?

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 ... */ 

Tôi có thể sử dụng cuộc gọi hoặc cuộc gọi hệ thống nào để thực hiện điều này?

Trả lời

7

Một số triển khai có fmemopen(). (Sau đó, tất nhiên bạn phải gọi fileno()).

Nếu không, bạn có thể tự xây dựng nó với fork()pipe().

+1

Nó chỉ ra rằng 'fileno()' thất bại trên cả Linux/FreeBSD (và tôi giả định người khác) khi 'FILE *' xuất phát từ 'fmemopen' hoặc một cái gì đó tương đương. Không có cách nào để lấy bộ mô tả tập tin, tôi không chắc là chúng ta có một giải pháp. –

+1

'fmemopen' cũng có thể được thực hiện bằng cách sử dụng' funopen' trên BSD. Một triển khai có sẵn tại https://redmine.openinfosecfoundation.org/attachments/105/0001-fmemopen-wrapper-added-fix-compilation-problems-on-m.patch –

+0

'fork()' là khá nặng cho Mục đích này. Thay vào đó, tôi khuyên bạn nên sử dụng một chuỗi. Sẽ tốt hơn nếu sử dụng 'select()' để ghép giữa đọc và viết từ đường ống, nhưng tôi đoán đó không phải là một tùy chọn ở đây. – Sven

2

Chắc chắn, chỉ cần open(argv[0], ...), quét qua tệp để tìm nơi dữ liệu nhị phân của bạn bắt đầu, lseek() tại đó và hoàn tất. Tệp đó sẽ không có độ dài dữ liệu nhị phân của bạn.

Các vấn đề liên quan