2009-10-13 26 views

Trả lời

13

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(""); 
} 
+0

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. –

+0

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. –

+0

Đâ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). –

0

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.

+1

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

+0

Đó 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

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