Nếu tôi có bộ đệm chứa dữ liệu của một tệp, làm cách nào tôi có thể nhận được một bộ mô tả tệp từ nó? Đây là câu hỏi bắt nguồn từ how to untar file in memoryLàm thế nào để có được bộ mô tả tập tin của bộ đệm trong bộ nhớ?
Trả lời
Tôi đã viết một ví dụ đơn giản như thế nào để làm cho đặc tả tập tin đến một khu vực bộ nhớ:
#include <unistd.h>
#include <stdio.h>
#include <string.h>
char buff[]="qwer\nasdf\n";
int main(){
int p[2]; pipe(p);
if(!fork()){
for(int buffsize=strlen(buff), len=0; buffsize>len;)
len+=write(p[1], buff+len, buffsize-len);
return 0;
}
close(p[1]);
FILE *f = fdopen(p[0], "r");
char buff[100];
while(fgets(buff,100,f)){
printf("from child: '%s'\n", buff);
}
puts("");
}
Bạn không thể. Không giống như C++, mô hình C của tệp I/O không mở để mở rộng.
fmemopen có thể trở lại FILE * từ đệm, nhưng fileno (fmemopen (...)) trả về -1. Tôi đã có một ý tưởng khác: tạo nội dung đệm và nguồn cấp dữ liệu đệm cho file_pipes [1] bằng hàm write(), và chúng ta có thể xem file_pipes [0] như là bộ mô tả tệp của bộ đệm đó. Nhưng khi tôi thực hành điều này, hàm write() vừa bị chặn. Là hạt nhân đệm của ống không đủ lớn? Cảm ơn – solotim
Đó là POSIX, IIRC. Không phải C, đó là cách bạn gắn thẻ câu hỏi của mình. I E. nó sẽ không hoạt động trên Windows. – MSalters
- 1. Bộ sưu tập lưu trong bộ nhớ đệm trong backbone.js?
- 2. Rails - etags so với bộ nhớ đệm trang (bộ nhớ cache tập tin)
- 3. Làm thế nào để xóa bộ nhớ đệm MKMapView?
- 4. ftell trên một bộ mô tả tập tin?
- 5. Làm cách nào để ngăn các trình duyệt lưu trong bộ nhớ đệm tập tin CSS?
- 6. Làm thế nào để xác định xem một bộ mô tả tập tin có thể tìm kiếm được không?
- 7. tập tin âm thanh Streaming và bộ nhớ đệm nó
- 8. Chuyển hướng Bash với bộ mô tả tập tin hoặc tên tập tin trong biến
- 9. Làm thế nào để không đồng bộ tuôn ra một tập tin ánh xạ bộ nhớ?
- 10. Làm thế nào để theo dõi bộ nhớ trống (bao gồm bộ đệm và bộ đệm) trong java?
- 11. Bộ nhớ cache, tắt bộ nhớ đệm
- 12. Làm thế nào để xóa bộ nhớ cache/bộ nhớ đệm in trên MacOSX
- 13. Bộ nhớ đệm Hibernate?
- 14. Làm thế nào để xóa bộ nhớ đệm Sprockets?
- 15. Bộ lọc Servlet cho bộ nhớ đệm của trình duyệt?
- 16. Bộ nhớ đệm mùa xuân so với bộ nhớ đệm
- 17. Làm thế nào để bộ nhớ cache một bộ sưu tập trong Magento?
- 18. Làm thế nào để tắt bộ nhớ đệm của xây dựng định nghĩa trong Visual studio
- 19. tải .so tập tin từ bộ nhớ
- 20. Bộ nhớ đệm trong của DbContext (?)
- 21. C - tạo tập tin trong bộ nhớ
- 22. Ngăn không cho VirtualBox Guest cung cấp các tập tin được lưu trong bộ nhớ đệm
- 23. Class.forName() bộ nhớ đệm
- 24. Làm thế nào để làm mới #include file - họ có bộ nhớ đệm trên IIS7/ASP.NET
- 25. Làm thế nào để đệm bộ đệm trong bộ nhớ và ghi nó từ một chủ đề chuyên dụng
- 26. gọi hệ thống tới bộ nhớ bản đồ đến một bộ mô tả tệp (mmap ngược)?
- 27. Làm thế nào bạn có thể xóa một ghi bằng cách sử dụng một bộ mô tả tập tin?
- 28. Tạo một chủ đề mới Mô tả tập tin trùng lặp và bộ mô tả socket trong Linux?
- 29. Bash thay thế quá trình kép cho bộ mô tả tập tin sai
- 30. Lý thuyết bộ nhớ đệm
Rất đẹp. Khi tăng cường khiêm tốn, bạn có thể sử dụng ['fcntl (fd, F_SETPIPE_SZ, ...)'] (http://www.kernel.org/doc/man-pages/online/pages/man2/fcntl.2.html) để tăng kích thước bộ đệm ống. Ghi có vào [msandiford] (http://stackoverflow.com/a/14129599/781723) cho việc này. –
Trên Linux, ['vmsplice()'] (http://man7.org/linux/man-pages/man2/vmsplice.2.html) có thể hữu ích: nó tránh sự cần thiết cho một vòng lặp để ghi dữ liệu vào đường ống. –
Đây là một giải pháp khá tuyệt vời, nhưng nếu bạn cần để có thể làm nhiều hơn đọc từ fd (tức là tìm kiếm), sau đó điều này sẽ không hoạt động. Bạn không thể tìm kiếm trên một đường ống (ít nhất là không phải trên các nền tảng tôi sử dụng). –