2012-01-20 26 views
14

Tôi đã xem tài liệu nhưng tôi dường như không thể tìm thấy phần liên quan. Bất cứ ai có thể cho tôi biết những gì các cuộc gọi đến sync là cho trong đoạn mã sau?"file.sync = true" làm gì?

fh = Tempfile.new('tmp') 
fh.sync = true 

Trả lời

18

Cài đặt chế độ đồng bộ hóa của tệp.

Điều này ảnh hưởng đến các hoạt động trong tương lai và làm cho đầu ra được ghi mà không bị chặn khối.

Nếu f.tty? là đúng, tức là nếu tệp được kết nối với thiết bị giống như bàn điều khiển thì đầu ra không bị chặn theo bộ đệm. Nhưng khi đầu ra đi đến một đường ống hoặc tệp, f.tty? sẽ sai và thư viện I/O sẽ chuyển sang bộ đệm chặn , tức là tích lũy đầu ra trong bộ đệm và ghi nó chỉ khi tệp được đóng, chương trình thoát, hoặc bộ đệm lấp đầy. Đây là nhanh hơn và kết quả cuối cùng là như nhau.

Đặt f.sync = true đánh bại công tắc này. Điều này có thể hữu ích nếu đầu ra của đường ống được kết nối với một cái gì đó thực sự là một giao diện điều khiển hoặc trong một số cách tương tác hoặc nếu nội dung của tập tin đang được tích cực theo dõi.

+1

+1, điều quan trọng là duy trì bộ đệm càng nhiều càng tốt. Không có gì giống như khám phá cách đệm hữu ích là cách cứng. –

+1

Câu trả lời nhiều thông tin nhất. Cảm ơn. –

4

Về cơ bản, nó ghi mọi dữ liệu được lưu vào bộ nhớ vào ổ đĩa ngay lập tức.

+0

Âm thanh chính xác. Tôi tự hỏi tại sao nó không có trong tài liệu. http://www.ruby-doc.org/stdlib-1.9.3/libdoc/tempfile/rdoc/Tempfile.html –

+1

"Tôi tự hỏi tại sao nó không có trong tài liệu."? Bởi vì nó là một phần của IO? Hãy thử 'ri IO.sync'. –

+3

Câu trả lời này có phần gây hiểu nhầm. Thao tác ghi dữ liệu ra ngay lập tức là 'fh.fsync'. Phương thức '# sync' đặt chế độ đồng bộ và ảnh hưởng đến các hoạt động trong tương lai. Bây giờ, nếu bạn có nghĩa là "nguyên nhân * tương lai * hoạt động để ghi dữ liệu ngay lập tức", sau đó, chắc chắn. – DigitalRoss

2

Tempfile kế thừa từ IO. Từ tài liệu IO.sync:

ios.sync -> true or false 

------------------------------------------------------------------------------ 

Returns the current ``sync mode'' of ios. When sync mode is true, all 
output is immediately flushed to the underlying operating system and is not 
buffered by Ruby internally. See also IO#fsync. 

    f = File.new("testfile") 
    f.sync #=> false 
Các vấn đề liên quan