2012-03-06 15 views
5

Tôi muốn:Gửi tập tin ghi vào bộ đệm trong bộ nhớ (fopen một cái gì đó, nhưng viết để đệm, không đĩa)

  1. chuyển hướng stdout/stderr
  2. đến một bộ đệm trong bộ nhớ, chứ không phải hơn vào đĩa
  3. khi rời khỏi stdout/err chạy như bình thường

tôi biết làm thế nào để sử dụng dup2 và freopen tới:

  • chuyển hướng stdout/err vào một tập tin của tôi lựa chọn
  • khi rời khỏi stdout/err chạy như bình thường

... nhưng tôi không chắc chắn về mục 2?

REASON: Tôi muốn xử lý dữ liệu đi tới stdout/err (đến từ mã của bên thứ 3), sau đó gửi nó tới máy chủ web - trong khi vẫn để ứng dụng chạy như bình thường.

TẠI SAO? ... bởi vì ngay bây giờ khi ứng dụng của chúng ta chạy, chúng ta thấy dữ liệu quan trọng đi tới stdout (và err) từ mã của bên thứ 3, và đó là một PITA khiến người dùng cố gắng và lộn xộn xung quanh với logfiles cục bộ. Tôi muốn nắm bắt "N byte cuối cùng" vào một bộ đệm vòng, sau quá trình nó, và sau đó - iff có một vấn đề mà người dùng báo cáo - gửi cho máy chủ.

TẠI SAO S AV LỌC? ... vì đây là mã mà phải chạy trên iOS cũng như máy tính để bàn và "liên tục viết vào một tệp" là thứ tôi muốn tránh, vì tôi không muốn nó như một tệp. Ngoài ra ... Tôi phải lo lắng về việc duy trì tập tin đó, chủ động cắt tỉa kích thước của nó, v.v.

+1

Bạn có thể sử dụng đường ống. Kiểm tra giải pháp này: http://stackoverflow.com/questions/955962/how-to-buffer-stdout-in-memory-and-write-it-from-a-dedicated-thread – arc

+0

Một số Unix hoặc Posix có http : //pubs.opengroup.org/onlinepubs/9699919799/functions/fmemopen.html chức năng (lấy cảm hứng từ GNU). GNU cũng có http://linux.die.net/man/3/open_memstream có lẽ IOS của bạn có. –

+0

Tại sao mọi người dường như không biết ổ cắm unix là gì? Tạo một, dup2 stdin/stdout bên thứ ba của bạn với nó, sử dụng mã của bạn để xử lý nó, không có đĩa liên quan. – tbert

Trả lời

4

Stdout là một xử lý tệp cơ bản, có nghĩa là một con trỏ.

#include <stdio.h> 
#include <stdlib.h> 

int main(int argc, char **argv); 

int main (argc,argv) 
int argc; 
char **argv; 
{ 
    stdout = &(*stderr); 
    fprintf(stdout, "test"); 
    return 0; 
} 

Bằng cách tuyên bố stdout để trỏ đến một trình xử lý tệp khác, chương trình này chuyển hướng thiết bị xuất chuẩn. Để kiểm tra nó, biên dịch nó thành test và sau đó nhập ./test > t./test 2> t trên dòng lệnh.

Đường ống dẫn hướng được chuyển hướng sẽ vẫn xuất ra kiểm tra từ, trong khi đường ống stderr được chuyển hướng sẽ không.

Vì tệp là luồng, hãy đọc số section of the GNU C Library này để biết cách tạo luồng bộ nhớ. Ví dụ này tạo ra một bộ đệm văn bản để tự động thay đổi kích thước để giữ đầu vào, và chuyển hướng stdout để trỏ đến nó.

#include <stdio.h> 
#include <stdlib.h> 

int main(int argc, char **argv); 

int main (argc,argv) 
int argc; 
char **argv; 
{ 
    char *bp; 
    size_t size; 
    FILE *stream; 

    stream = open_memstream (&bp, &size); 
    stdout = &(*stream); 
    fprintf(stdout, "test"); 
    fflush(stdout); 
    fprintf(stderr, "buf = %s, size = %d\n", bp, size); 
    fclose (stream); 
    free(bp); 
    return 0; 
} 

Chú ý cẩn thận đến các phần khi xả bộ đệm khi chuyển đổi giữa đầu vào và đầu ra trong sách hướng dẫn.

+0

Ah, cảm ơn - dường như "dòng bộ nhớ" là cụm từ ma thuật mà tôi cần cho google. Tôi sẽ thử phương pháp này với iOS và xem nó có hoạt động không. Ngón tay đã vượt qua ... – Adam

+0

Tôi đề nghị thêm một 'free (bp)' vào cuối. Nó không quan trọng ở đây, nhưng nếu ai đó cắt và dán nó vào một chức năng, họ sẽ cần nó. –

+0

@MarkLodato Rất tiếc! Đã sửa. –

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