Bộ đệm sẽ tự động được xóa vào đĩa khi một quá trình thoát?


21

Khi tôi chuyển hướng đầu ra của lệnh sang một tệp (ví dụ echo Hello > file:) tệp đó có được đảm bảo có dữ liệu đó ngay sau khi lệnh thoát không? Hoặc vẫn còn một cửa sổ rất nhỏ giữa các lệnh thoát và dữ liệu được ghi vào tệp? Tôi muốn đọc tệp ngay sau khi thoát lệnh, nhưng tôi không muốn đọc tệp trống.


1
Nó có thể thực thi lệnh ngay lập tức, nhưng lượng thời gian cần thiết để thực sự mở tệp, ghi và đóng sẽ phụ thuộc vào tốc độ và loại ổ cứng của bạn, bất kỳ chương trình đang chạy nào, v.v.
miễn phí vào

Xét về ví dụ đã cho, 'quá trình' là gì? Là echo>không tách biệt các quá trình (sống ngắn)? Và nơi đầu ra của phần echocòn lại trước >được thực hiện?
oɔɯǝɹ

1
@ oɔɯǝɹ >là chuyển hướng vỏ. Nó giống như khi chương trình đã mở tệp được đặt tên để ghi và thay thế thiết bị xuất chuẩn bằng nó, đó chính xác là những gì trình bao.
Dan D.

7
Tôi nghĩ rằng trách nhiệm của hệ điều hành là cung cấp cho bạn phần filechứa Hellocho dù nó có bị xóa hay không.
Salman A

1
Nếu chương trình đang chạy trên máy A và bạn đang đọc tệp trên máy B, với hệ thống tệp của máy A được gắn qua mạng, thì bạn có thể sẽ đọc một tệp trống, tùy thuộc vào loại hệ thống tệp mạng và cài đặt gắn kết. Vì vậy, bạn có thể muốn tắt bộ nhớ đệm cho mount đó.
pts

Câu trả lời:


21

Có nhiều lớp đệm / bộ đệm liên quan.

  1. Bộ đệm CPU.

    Dữ liệu được đặt cùng nhau theo byte và được lưu trữ trong bộ đệm CPU. Nếu bộ đệm CPU đầy và dữ liệu không được truy cập trong một thời gian, khối chứa dữ liệu của chúng tôi có thể được ghi vào bộ nhớ chính. Đây là, phần lớn, được ẩn khỏi các lập trình viên ứng dụng.

  2. Các bộ đệm trong quá trình.

    Có một số bộ nhớ được đặt sang một bên trong quá trình thu thập dữ liệu, vì vậy chúng tôi cần thực hiện càng ít yêu cầu cho HĐH càng tốt, vì điều đó tương đối tốn kém. Quá trình sao chép dữ liệu vào các bộ đệm này, một lần nữa có thể được hỗ trợ bởi bộ đệm CPU, do đó không có gì đảm bảo rằng dữ liệu được sao chép vào bộ nhớ chính. Ứng dụng cần xóa sạch các bộ đệm này, ví dụ như sử dụng fclose (3) hoặc fsync (3). Hàm exit (3) cũng thực hiện việc này trước khi quá trình kết thúc, trong khi hàm _exit (2) thì không , đó là lý do tại sao có một cảnh báo lớn trong trang hướng dẫn cho hàm đó chỉ gọi nó nếu bạn biết bạn là gì đang làm.

  3. Bộ đệm kernel

    Hệ điều hành sau đó giữ bộ đệm riêng của mình, để giảm thiểu số lượng yêu cầu cần gửi đến các đĩa. Bộ đệm này không thuộc về quy trình cụ thể, vì vậy dữ liệu trong đó có thể thuộc về các quy trình đã hoàn thành và vì tất cả các truy cập đều đi qua đây, chương trình tiếp theo sẽ thấy dữ liệu nếu đã đến đây. Nhân sẽ ghi dữ liệu này vào các đĩa khi có thời gian để làm như vậy hoặc khi được hỏi rõ ràng.

  4. Bộ nhớ cache của ổ đĩa

    Bản thân các ổ đĩa cũng giữ một bộ đệm để tăng tốc truy cập. Chúng được viết khá nhanh và có lệnh ghi dữ liệu còn lại vào bộ nhớ cache và báo cáo khi hoàn thành, hệ điều hành sử dụng khi tắt máy để đảm bảo không có dữ liệu nào bị bỏ qua trước khi tắt nguồn.

Đối với ứng dụng của bạn, dữ liệu được đăng ký trong bộ đệm kernel là đủ (dữ liệu thực tế có thể vẫn còn trong bộ nhớ CPU tại thời điểm này và có thể không được ghi vào bộ nhớ chính): quá trình "echo" chấm dứt có nghĩa là bất kỳ bộ đệm trong quá trình nào cũng phải được xóa và dữ liệu được chuyển cho HĐH và khi bạn bắt đầu một quy trình mới, điều đó được đảm bảo rằng HĐH sẽ trả lại dữ liệu tương tự khi được yêu cầu.


7
Xem xét bộ nhớ đệm CPU dường như không liên quan đến tôi. Đó là một mức độ không cần thiết của chi tiết ở đây. Như sẽ đi qua tất cả các chi tiết cho đến khi một số lượng vật lý đại diện cho một bit trên đĩa cứng hoặc bộ nhớ ssd được thay đổi để lật nó.
mvw

3
Thật vậy, bộ đệm CPU khá trực giao.
Simon Richter

2
Và quan trọng hơn, bộ đệm CPU được kết hợp giữa các lõi, đó là lý do tại sao nó hoàn toàn không có trong hình. Trên x86, nó thậm chí còn kết hợp với DMA (và x86 có chế độ sắp xếp thứ tự bộ nhớ tổng cửa hàng), do đó, bất kỳ ai có thể đọc bộ nhớ sẽ thấy dữ liệu được lưu trữ gần đây nhất theo địa chỉ đó theo thứ tự toàn cầu của các hoạt động bộ nhớ. (Một lõi CPU sẽ nhìn thấy các cửa hàng của chính nó ngay cả trước khi chúng hiển thị trên toàn cầu, do chuyển tiếp cửa hàng từ hàng đợi cửa hàng). Trên các nền tảng không phải là x86 không có DMA kết hợp bộ đệm, nhân Linux đảm bảo bộ đệm được xóa trước DMA đến các địa chỉ đó.
Peter Cordes

1
"Phần lớn chúng bị ẩn khỏi các lập trình viên ứng dụng." Tại sao "phần lớn"? Tôi là một nhà phát triển nhúng và ngoại trừ trong quá trình tải khởi động (vì vậy không phải là "ứng dụng") Tôi hoàn toàn bỏ qua bộ đệm CPU. Tôi không nghĩ bất kỳ nhà phát triển ứng dụng nào cũng có thể bị ảnh hưởng bởi tác động của bộ đệm CPU.
Sam

1
@Sam bộ nhớ cache bị lỗi / lần truy cập cùng với thực thi đầu cơ có thể được khai thác trong một số CPU để bỏ qua các hạn chế truy cập đọc. Có lẽ đây là những gì câu trả lời đã được đề cập?
John Dvorak

22

Nếu ứng dụng không có bất kỳ bộ nhớ cache nội bộ nào, thì những thay đổi sẽ được ghi ngay vào tệp. Tương tự cho ví dụ của bạn. Các tập tin là một thực thể logic trong bộ nhớ sẽ được cập nhật ngay lập tức. Bất kỳ hoạt động tiếp theo nào trên tệp sẽ thấy các thay đổi được thực hiện bởi chương trình.

Tuy nhiên , điều này không có nghĩa là thay đổi đã được ghi vào đĩa vật lý. Các thay đổi có thể kéo dài trong bộ đệm hệ điều hành hoặc bộ đệm phần cứng. Để xóa bộ đệm hệ thống tập tin, sử dụng synclệnh.

Tôi muốn đọc tệp ngay sau khi thoát lệnh, nhưng tôi không muốn đọc tệp trống.

Bạn không nên gặp bất kỳ vấn đề thực tế nào ở đây.


1
Nếu ứng dụng không có bất kỳ bộ nhớ cache nội bộ nào - đó là một tập tin rất lớn nếu như: một phần lớn các triển khai thư viện I / O sử dụng thiết bị xuất chuẩn bộ đệm theo mặc định. Điều đó nói rằng, ví dụ, tiêu chuẩn C bắt buộc bộ đệm xuất chuẩn sẽ bị xóa khi thoát (nhưng có khả năng là không nếu exitít nhất là không được gọi ngầm). Các thư viện / ngôn ngữ khác (ví dụ Java!) Cung cấp ít bảo đảm hơn.
Konrad Rudolph

Điều gì nếu chỉ giới hạn nó trong nguyên thủy chuyển hướng (nghĩa là lệnh trong câu hỏi của tôi)? Nó không có bộ nhớ trong, phải không?
Eric

@Eric Không, bạn sẽ ổn thôi.
mtak

10
Tôi không chắc chắn nếu tôi nhận được câu trả lời này. Câu hỏi là về "khi quá trình thoát". Mọi ứng dụng có bộ đệm ghi nội bộ sẽ xóa chúng vào đĩa khi thoát quá trình, nếu điều đó không xảy ra trước đó. IOW, những bộ nhớ cache không quan trọng ở đây.
MSalters

2
Hơn nữa, một bộ đệm nội bộ sẽ bị xóa khi thoát hoặc chỉ mờ dần khỏi sự tồn tại, phải không? Vì vậy, ngay cả khi bộ đệm nội bộ không xóa, nội dung sẽ không thể quan sát được, bất kể người ta sẽ đợi bao lâu.
WorldSEnder

21

Bộ đệm sẽ tự động được xóa vào đĩa khi một quá trình thoát?

Nói chung câu trả lời là không .

Nó phụ thuộc vào lệnh. Như các câu trả lời khác đề cập, nếu lệnh không đệm nội bộ dữ liệu, tất cả dữ liệu sẽ có sẵn khi lệnh kết thúc.

Nhưng hầu hết, nếu không phải tất cả, các thư viện I / O tiêu chuẩn sẽ làm xuất chuẩn bộ đệm theo mặc định (ở một mức độ nào đó) và đưa ra các đảm bảo khác nhau về việc tự động xóa bộ đệm khi đóng ứng dụng.

C đảm bảo rằng một lối thoát bình thường sẽ tuôn ra bộ đệm . Lối thoát thông thường có nghĩa là có nghĩa exitlà được gọi - hoặc rõ ràng hoặc quay trở lại main. Tuy nhiên, lối ra bất thường có thể phá vỡ cuộc gọi này (và do đó để lại bộ đệm không bị xóa phía sau).

Đây là một ví dụ đơn giản:

#include <signal.h>
#include <stdio.h>

int main() {
    printf("test");
    raise(SIGABRT);
}

Nếu bạn biên dịch nó và thực thi nó, testsẽ không nhất thiết phải được ghi vào thiết bị xuất chuẩn.

Các ngôn ngữ lập trình khác thậm chí còn đảm bảo ít hơn: ví dụ Java, không tự động xóa khi kết thúc chương trình . Nếu bộ đệm đầu ra chứa một dòng bị hủy, thì nó có thể bị mất, trừ khi System.out.flush()được gọi một cách rõ ràng.

Điều đó nói rằng, cơ thể câu hỏi của bạn hỏi cái gì đó hơi khác nhau: nếu dữ liệu đến trong các tập tin ở tất cả , nó nên làm như vậy ngay sau khi chấm dứt lệnh (tùy thuộc vào sự cẩn thận mô tả trong các câu trả lời khác).


7
Tôi cũng đã thấy lối ra bất thường khi một công cụ dòng lệnh đang ghi vào một tệp và vào thiết bị xuất chuẩn hoặc thiết bị xuất chuẩn, như nhật ký gỡ lỗi và người dùng đã thực hiện một đường ống để đầu hoặc ít hơn sau đó gõ 'q' để thoát ra ít hơn. Tệp đĩa không phải lúc nào cũng được xóa hoàn toàn nếu công cụ dòng lệnh không xử lý SIGPIPE.
Zan Lynx

+1, nhưng "cần thực hiện ngay sau khi lệnh kết thúc" không hoàn toàn đúng: mọi cuộc gọi write()hoặc pwrite()hệ thống sẽ xảy ra trước khi quá trình thoát, và đó là khi thay đổi tệp hiển thị. Vì vậy, thay đổi tập tin cuối cùng chắc chắn là trước khi chấm dứt quá trình, ngay lập tức - trước đó muộn nhất. Tôi nghĩ ngay cả với một mmap(MAP_SHARED)tệp, không có cách nào để quan sát quá trình chấm dứt xảy ra trước khi tất cả các thay đổi tệp sẽ xảy ra.
Peter Cordes

9

Tôi nghĩ rằng chưa có câu hỏi nào giải quyết vấn đề này đầy đủ:

Tôi muốn đọc tệp ngay sau khi thoát lệnh, nhưng tôi không muốn đọc tệp trống.

Như các câu trả lời khác giải thích, một chương trình ứng xử tốt sẽ xóa bộ đệm tệp bên trong của nó trước khi quá trình kết thúc bình thường . Sau đó, dữ liệu vẫn có thể lưu lại trong bộ đệm kernel hoặc phần cứng trước khi nó được ghi vào bộ lưu trữ liên tục. Tuy nhiên , ngữ nghĩa hệ thống tệp của Linux đảm bảo rằng tất cả các quy trình xem nội dung của các tệp giống như hạt nhân bao gồm cả bộ đệm nội bộ 1 .

Điều này thường được thực hiện bằng cách có nhiều nhất một bộ đệm trong nhân cho mỗi đối tượng tệp và để yêu cầu tất cả quyền truy cập tệp phải đi qua bộ đệm này.

  • Nếu một tiến trình đọc một tệp, kernel sẽ trình bày nội dung bộ đệm cho tiến trình, nếu phần tệp được yêu cầu hiện nằm trong bộ đệm; nếu không, kernel sẽ lấy dữ liệu từ phương tiện lưu trữ bên dưới và đặt nó vào bên trong bộ đệm, sau đó quay lại bước trước.

  • Nếu một quá trình ghi vào một tệp, dữ liệu trước tiên được đặt bên trong bộ đệm trong nhân cho tệp đó. Cuối cùng, nội dung bộ đệm sẽ được xóa để lưu trữ. Trong thời gian trung bình, quyền truy cập đọc được thỏa mãn từ cùng một bộ đệm (xem bên trên).


1 Ít nhất cho các tập tin thông thường, thư mục và các liên kết tượng trưng. FIFO và socket là một vấn đề khác vì nội dung của chúng không bao giờ được lưu trữ liên tục. Có một số trường hợp đặc biệt của các tệp thông thường có nội dung phụ thuộc vào người hỏi; ví dụ là các tệp trong Procfs và sysfs (nghĩ rằng /proc/selfđó là một liên kết tượng trưng đến ID tiến trình của quá trình đọc liên kết tượng trưng).


2
Nói một cách chính xác, đó không phải là ngữ nghĩa hệ thống tập tin của Linux đảm bảo điều này, đó là ngữ nghĩa POSIX. Cụ thể, BSD hoạt động giống hệt như macOS và thậm chí cả Windows (mặc dù đây là một trong số ít trường hợp Windows tuân theo ngữ nghĩa POSIX). Điều này cũng cho rằng không ai làm những thứ kỳ quặc với mmap()và O_DIRECT, điều này có thể dẫn đến những thứ không đồng bộ giữa đĩa và bộ đệm trang (nhưng điều đó sẽ giải quyết thời điểm quá trình thực hiện đó).
Austin Hemmelgarn

2
@AustinHemmelgarn: Nói đúng ra cả hai chúng tôi đều đúng vì Linux được thiết kế với sự hỗ trợ cho các ứng dụng Unix (System V) và sau đó được thực hiện để hỗ trợ POSIX, cũng dựa trên nhiều khái niệm về System V.
David Foerster vào

5

Giả sử lệnh của bạn được thực thi bởi một số chương trình bằng thư viện thời gian chạy C, tại một số điểm, nó sẽ gọi fcloseđể đóng tệp đang mở.

Trang man cho fclosehàm C cho biết:

GHI CHÚ Lưu ý rằng fclose () chỉ xóa bộ đệm không gian người dùng được cung cấp bởi thư viện C. Để đảm bảo dữ liệu được lưu trữ vật lý trên đĩa, bộ đệm kernel cũng phải được xóa, ví dụ, với đồng bộ hóa (2) hoặc fsync (2).

và trang người đàn ông cho fflushcó cùng một lưu ý. Trang người đàn ông cho closebiết:

Một lần đóng thành công không đảm bảo rằng dữ liệu đã được lưu thành công vào đĩa, vì kernel đã ghi. Nó không phổ biến cho một hệ thống tập tin để xóa bộ đệm khi luồng được đóng lại. Nếu bạn cần chắc chắn rằng dữ liệu được lưu trữ vật lý, hãy sử dụng fsync (2). (Nó sẽ phụ thuộc vào phần cứng đĩa vào thời điểm này.)

Lưu ý rằng dữ liệu có sẵn cho các quá trình khác ngay cả khi nó không được đồng bộ hóa với ổ đĩa. Có lẽ điều đó đã đủ tốt cho bạn.

Nếu bạn nghi ngờ, hãy viết một bài kiểm tra.


2
C hoặc không, mọi thứ sẽ / nên sử dụng tòa nhà close()để đóng mô tả của tệp.
Attie

@Attie: Bạn không cần phải gửi closetệp trước khi thoát (trong các chương trình hack không kiểm tra lỗi); kernel sẽ dọn sạch chúng, gọi closecho bạn một cách hiệu quả sau khi quá trình của bạn chết. Tuy nhiên, bạn cần phải thực hiện fclosebất kỳ luồng stdio được đệm nào hoặc để libc làm điều đó cho bạn exit(3), trái ngược với cuộc gọi hệ thống thoát trực tiếp.
Peter Cordes

Nếu bạn nghi ngờ, hãy viết một bài kiểm tra. Đây là lời khuyên tồi để phát hiện các điều kiện chủng tộc. Thử nghiệm trên một hạt nhân chạy trên một phần cứng có thể cho bạn biết rằng cuộc đua không thể xảy ra trong các điều kiện phần mềm do thử nghiệm của bạn tạo ra trên hệ thống đó hoặc nếu nó quá hiếm để phát hiện. Nhưng nó không thể cho bạn biết liệu hành vi đó được cho là an toàn trên tất cả các hệ thống tệp, hạt nhân và tất cả phần cứng (ví dụ: PowerPC). tức là bạn không thể biết liệu bảo lãnh mà bạn phụ thuộc là chi tiết triển khai hay bảo đảm bằng chứng trong tương lai có chủ ý! (Trong trường hợp này là vậy.)
Peter Cordes

Nó phụ thuộc vào tình hình. Một số người cố gắng để chạy kịch bản shell của anh ta có thể được giúp đỡ bởi lời khuyên này. Nó không nhằm mục đích là giải pháp chung cho các môi trường tiên tiến hơn nhưng ít có khả năng hơn, ví dụ như một kỹ sư phần mềm làm việc trên nhân hệ điều hành, một số người làm việc về cập nhật vi mã của Intel hoặc một số gal đang làm việc trên một số hệ thống cho ISS.
mvw

3

Khi tôi chuyển hướng đầu ra của lệnh sang một tệp (ví dụ echo Hello > file:) tệp đó có được đảm bảo có dữ liệu đó ngay sau khi lệnh thoát không?

Vâng. Shell mở tệp echođầu ra và xuất trực tiếp ra tệp đó. Sau khi thoát lệnh, thế là xong.

Hoặc vẫn còn một cửa sổ rất nhỏ giữa các lệnh thoát và dữ liệu được ghi vào tệp?

Cho dù dữ liệu đã có trên phương tiện truyền thông là một vấn đề khác, điều này chỉ quan trọng nếu sau đó xảy ra lỗi phần cứng hoặc bạn kiểm tra phân vùng trực tiếp bằng một số phần mềm pháp y, bỏ qua hệ thống tệp được gắn.

Tôi muốn đọc tệp ngay sau khi thoát lệnh, nhưng tôi không muốn đọc tệp trống.

Đừng lo lắng, kernel chỉ giữ một chế độ xem tệp, không phụ thuộc vào tần suất mở.


"Hạt nhân chỉ giữ một chế độ xem tệp": không hoàn toàn đúng đối với mmap(MAP_SHARED): lưu trữ vào vùng được tạo ra không phù hợp với việc đọc tệp (theo luồng đó hoặc các quy trình khác). Đây là lý do tại sao msync(2)tồn tại. Ít nhất đó là những gì các trang người đàn ông cảnh báo; tùy thuộc vào việc triển khai, Linux thực sự có thể ánh xạ các trang vật lý từ pagecache, trong trường hợp đó tôi đoán rằng về cơ bản nó là mạch lạc (sắp xếp bộ nhớ modulo). Dù sao, tất cả vẫn xảy ra trước đây _exit(2).
Peter Cordes

2

Theo nguyên tắc chung, mọi dữ liệu thuộc sở hữu của kernel đều được duy trì và làm sạch bởi kernel, theo giai đoạn. Dữ liệu này bao gồm dữ liệu được chuyển đến bộ nhớ kernel bằng một cuộc gọi hệ thống như write(2).

Tuy nhiên, nếu ứng dụng của bạn (ví dụ thư viện C) thực hiện đệm trên đầu trang này, thì rõ ràng kernel không có ý tưởng và do đó không đảm bảo việc dọn dẹp của nó.

Hơn nữa, tôi không tin rằng có bất kỳ sự đảm bảo về thời gian nào cho việc dọn dẹp, nói chung, nó được thực hiện trên cơ sở "nỗ lực tốt nhất" (đọc: "khi tôi có một giây").


Có một sự đảm bảo rằng mọi hoạt động dọn dẹp / dọn dẹp bộ đệm sẽ xảy ra trước khi quá trình cha mẹ waitpid()quay trở lại, nếu việc dọn dẹp xảy ra. tức là các quy trình khác không thể trực tiếp quan sát việc chấm dứt quá trình xảy ra trước khi bất kỳ sửa đổi tệp nào được thực hiện bởi quy trình đó. (Tôi đã nói "trực tiếp" để loại trừ việc quan sát gián tiếp thông qua dấu thời gian của tệp NFS, vì bộ nhớ đệm NFS không hoàn toàn kết hợp giữa các máy chủ.)
Peter Cordes

@PeterCordes: Tôi cho rằng nó phụ thuộc vào ý của bạn khi "dọn dẹp" thay vì "duy trì". Đối với tôi "duy trì" là "cung cấp một cái nhìn mạch lạc" (có bảo đảm mà bạn đã đề cập) và "dọn dẹp" là "tuôn ra đĩa" mà tôi không tin là có bảo đảm thời gian.
Mehrdad

Ồ tôi hiểu rồi, bạn đang trả lời phần "tuôn ra đĩa" của câu hỏi không liên quan đến những gì các quá trình sau này sẽ thấy khi đọc tệp. "Dọn dẹp" theo nghĩa "làm sạch bộ nhớ cache / bộ nhớ đệm / bộ nhớ đệm". Đúng, không đảm bảo thời gian trừ khi bạn sử dụng fsync/ fdatasync, mặc dù việc ghi lại bộ đệm trên Linux sẽ bắt đầu sau một /proc/sys/vm/dirty_writeback_centisecsphần trăm giây (nếu không bị trì hoãn bởi lưu lượng I / O khác) và nhiều điều chỉnh khác trong thư mục Procfs cũng ảnh hưởng đến mọi thứ (ví dụ: lớn để cho bộ đệm phát triển trước khi thực hiện bất kỳ ghi lại).
Peter Cordes

2

Hoặc vẫn còn một cửa sổ rất nhỏ giữa các lệnh thoát và dữ liệu được ghi vào tệp?

Không, không có.

Tôi muốn đọc tệp ngay sau khi thoát lệnh, nhưng tôi không muốn đọc tệp trống.

Bạn có thể đọc nội dung cuối cùng của tệp ngay sau khi thoát lệnh, thay vào đó bạn sẽ không bao giờ đọc tệp trống. (Trong C và C ++, sử dụng chờ đợi , waitpid , wait3 hoặc wait4 hệ thống các cuộc gọi chờ cho chương trình để thoát, và chỉ sau đó đọc các tập tin. Nếu bạn đang sử dụng một vỏ, ngôn ngữ lập trình khác hoặc một thư viện (ví dụ như thư viện C gọi hệ thống hoặc lớp Quy trình Java ), có lẽ nó đã sử dụng một trong các cuộc gọi hệ thống này.)

Như các câu trả lời và nhận xét khác đã chỉ ra, cuối cùng bạn có thể đọc một tệp trống sau khi thoát khỏi chương trình nếu chương trình đã thoát mà không xóa bộ đệm đầu ra bên trong của nó (ví dụ vì _exit , hủy bỏ hoặc nhận tín hiệu gây tử vong hoặc vì nó một chương trình Java thoát bình thường). Tuy nhiên, không có gì bạn có thể làm về vấn đề này vào thời điểm này: dữ liệu không được lưu bị mất vĩnh viễn, chờ thêm sẽ không phục hồi được.


0

Vâng

Xin lỗi vì có thể thêm một câu trả lời thừa, nhưng hầu hết dường như tập trung vào cá trích đỏ của tiêu đề của câu hỏi. Nhưng theo như tôi có thể nói, câu hỏi không phải là về bộ đệm, mà là:

Khi tôi chuyển hướng đầu ra của lệnh sang một tệp (ví dụ: echo Hello> tệp) thì tệp đó có được đảm bảo có dữ liệu đó ngay sau khi lệnh thoát không?

Vâng, vô điều kiện. Việc sử dụng ">" mà bạn đang mô tả, cùng với "|" và "<", là mô hình xử lý dựa trên đường ống mà thế giới Unix và Linux chủ yếu dựa vào. Bạn sẽ tìm thấy hàng trăm, nếu không phải hàng ngàn tập lệnh hoàn toàn phụ thuộc vào hành vi này trong mỗi lần cài đặt Linux.

Nó hoạt động như bạn muốn trên mỗi thiết kế, và nếu thậm chí có khả năng xảy ra tình trạng đua nhỏ nhất, nó có thể đã được sửa chữa từ nhiều thập kỷ trước.


Điều này là thừa, không may. Chỉ có một vài câu trả lời chủ yếu tập trung vào cá trích đỏ cam kết dữ liệu vào bộ lưu trữ không bay hơi. Xem câu trả lời của @ pts và một số người khác để biết mô tả rõ ràng: sửa đổi tệp xảy ra trước khi thoát hoặc hoàn toàn không.
Peter Cordes
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.