TL/DR: sử dụng IO::Handle
và flush
phương pháp, ví dụ:
use IO::Handle;
$myfile->flush();
Trước tiên, bạn cần phải quyết định như thế nào "đỏ mặt" bạn muốn nó. Có thể có một vài lớp đệm:
Bộ đệm trong của Perl trên bộ xử lý tệp. Các chương trình khác không thể xem dữ liệu cho đến khi nó rời khỏi bộ đệm này.
Đệm cấp hệ thống tệp của khối tệp "bẩn". Các chương trình khác vẫn có thể thấy những thay đổi này, chúng dường như được "viết", nhưng chúng sẽ bị mất nếu hệ điều hành hoặc máy bị treo.
Ghi bộ đệm ghi đè cấp độ đĩa. Hệ điều hành cho rằng chúng được ghi vào đĩa, nhưng đĩa thực sự chỉ lưu trữ chúng trong bộ nhớ dễ bay hơi trên ổ đĩa. Nếu hệ điều hành gặp sự cố, dữ liệu sẽ không bị mất, nhưng nếu mất điện thì có thể trừ khi đĩa có thể ghi ra trước. Đây là một vấn đề lớn với SSD tiêu dùng rẻ.
Sẽ phức tạp hơn nữa khi SAN, hệ thống tệp từ xa, bộ điều khiển RAID, vv tham gia. Nếu bạn đang viết qua đường ống thì cũng có bộ đệm ống để xem xét.
Nếu bạn chỉ muốn tuôn bộ đệm Perl, bạn có thể close
file, print
một chuỗi chứa "\n"
(vì có vẻ như Perl xả vào dòng mới), hoặc use IO::Handle
's flush
method.
Bạn cũng có thể, mỗi the perl faq sử dụng binmode
hoặc chơi với $|
để làm cho tệp không được xử lý. Đây là không giống như điều khi xóa bộ đệm được đệm, vì việc xếp hàng loạt các bộ đệm được đệm sau đó thực hiện một lần xả đơn có chi phí hiệu suất thấp hơn nhiều so với việc ghi vào bộ xử lý không bị chặn.
Nếu bạn muốn xóa hệ thống tệp ghi đệm, bạn cần sử dụng lệnh gọi hệ thống như fsync()
, mở tệp ở chế độ O_DATASYNC
hoặc sử dụng một trong nhiều tùy chọn khác. Nó phức tạp một cách đau đớn, được chứng minh bằng thực tế là PostgreSQL has its own tool just to test file syncing methods.
Nếu bạn muốn chắc chắn rằng nó thực sự, thực sự, trung thực trên ổ đĩa cứng trong bộ nhớ vĩnh viễn, bạn phải tuôn ra nó vào hệ thống tệp trong chương trình của bạn. Bạn cũng cần phải cấu hình ổ đĩa cứng/SSD/RAID controller/SAN/bất cứ điều gì để thực sự tuôn ra khi hệ điều hành yêu cầu nó. Điều này có thể phức tạp đáng ngạc nhiên để làm và khá OS/phần cứng cụ thể. Thử nghiệm "plug-pull" được khuyến khích mạnh mẽ để đảm bảo bạn thực sự đã thực hiện đúng.
Nguồn
2013-07-19 08:07:54
Trong perl "cơ bản" không có chức năng tuôn ra, nhưng nếu bạn gọi 'binmode $ filehandle', nó sẽ đặt định dạng': raw' và (như là một ảnh hưởng phụ) nó sẽ làm cho việc tuôn ra. Nó hoạt động độc đáo. Dù sao, nếu nó nằm trên un * x, bạn có thể tạo một đường ống có tên là hệ thống tập tin, và bạn có thể ghi trực tiếp vào nó. – TrueY
Làm cho chương trình C++ của bạn đọc từ một đường ống ('/ dev/stdin' nếu nó đủ ngu ngốc để yêu cầu tên tệp) và kiểm tra xem nó có thực sự đọc một dòng tại một thời điểm không - làm ở bên viết. – reinierpost