2013-03-12 24 views
9

Tôi có một ổ cắm tôi đang làm select() trên đó, chờ quá trình ghi khác. Sau khi ghi, tôi đọc dữ liệu và ghi nó vào một bộ mô tả tập tin khác. Câu hỏi của tôi là, nếu có một cách để kết nối ổ cắm với bộ mô tả tệp, vì vậy khi có sẵn dữ liệu, nó sẽ được tự động ghi vào bộ mô tả tệp khác?bắc cầu giữa hai bộ mô tả tệp

Bằng cách này, tôi có thể ném một cách bộ đệm mà tôi đang sử dụng và bỏ qua một chuỗi trong hệ thống.

+1

Tại sao bạn cần một chủ đề bây giờ? – hyde

+0

Bạn có thể mô tả vấn đề bạn đang cố giải quyết không? Ống làm chính xác những gì bạn muốn, chỉ từ các dòng cụ thể. Vấn đề của bạn có phải là mạng cụ thể không? –

+0

@MichaelFoukarakis Tôi đang phát triển môi trường ghi nhật ký cho một daemon với mã cũ. Tôi không thể thay đổi việc thực hiện, dù sao, đường ống chỉ làm việc trong cùng một bối cảnh quy trình, mà không làm việc cho tôi. – stdcall

Trả lời

4

Xin lỗi nếu tôi hiểu lầm trường hợp của bạn, nhưng bạn có ý nghĩa gì đó giống như sendfile?

sendfile - Chuyển dữ liệu giữa các file descriptor

#include <sys/sendfile.h> 
ssize_t sendfile(int out_fd, int in_fd, off_t * offset ", size_t" " count"); 

sendfile() bản sao dữ liệu giữa một bộ mô tả tập tin và khác. Bởi vì việc sao chép này được thực hiện trong hạt nhân, sendfile() hiệu quả hơn sự kết hợp của read (2) và write (2), mà sẽ yêu cầu truyền dữ liệu đến và từ không gian người dùng.

+0

+1, tôi nghĩ đó là những gì anh ta muốn. – StarPinkER

+4

Đoạn trích từ trang người được liên kết: * Đối số in_fd phải tương ứng với tệp hỗ trợ thao tác mmap (2) giống như (không thể là ổ cắm). * – hyde

+0

Trong tệp gửi kinh nghiệm của tôi nhanh hơn rất nhiều ... –

6

Trên linux, sử dụng splice() có thể phù hợp hơn, khi hướng từ ổ cắm vào tệp. Sử dụng splice() phức tạp hơn một chút, nhưng bạn nhận được cả hai hướng. Ngoài ra, tôi nghĩ rằng sendfile sử dụng mối nối internally những ngày này.

Có nhiều câu hỏi về SO đã thảo luận về sự khác biệt giữa mối nối() và sendfile(). Tìm kiếm trên web cũng tiết lộ các báo cáo mâu thuẫn về mối liên kết giữa nguồn (và nguồn). Cách tốt nhất để biết nếu nó phù hợp cho trường hợp của bạn, là để kiểm tra nó.

SO về hệ thống tập tin tương thích: Which file systems support splicing via Linux's splice(2)?

SO về hạt nhân cũ không hỗ trợ nối cho socket TCP: Does Linux's splice(2) work when splicing from a TCP socket?

Splice giải thích: http://kerneltrap.org/node/6505

nguồn Splice: http://lxr.linux.no/#linux+v3.8.2/fs/splice.c

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