Nếu chúng ta sử dụng echo 1234 >> some-file
thì Tài liệu nói rằng đầu ra được nối thêm.
Tôi đoán là, nếu một số tệp không tồn tại, thì O_CREAT sẽ tạo một tệp mới. Nếu >
được sử dụng, thì O_TRUNC sẽ cắt bớt tệp hiện có.
Trong trường hợp >>
: Tập tin sẽ được mở dưới dạng O_WRONLY (hoặc O_RDWR) và tìm cách kết thúc và ghi thao tác được thực hiện, mô phỏng O_APPEND? Hoặc tệp sẽ được mở dưới dạng O_APPEND, để nó vào kernel để đảm bảo việc nối thêm xảy ra?
Tôi đang hỏi điều này bởi vì một quy trình máy chủ đang ghi đè một số điểm đánh dấu được chèn bởi echo, khi tệp đầu ra từ điểm gắn NFS, & Tài liệu NFS nói rằng O_APPEND không được hỗ trợ trên máy chủ, do đó, máy khách sẽ phải xử lý nó. Tôi đoán quá trình máy chủ đang sử dụng O_APPEND, nhưng không chắc chắn về bash >>
trên linux, do đó đặt câu hỏi ở đây.
O_APPEND
được hỗ trợ; Vấn đề là nó được mô phỏng. Trên hệ thống tệp cục bộ, một số quy trình ghi vào cùng một tệp được mởO_APPEND
sẽ không bao giờ ghi đè lên dữ liệu của nhau; trên NFS,O_APPEND
được mô phỏng bằng cách tìm kiếm đến cuối trước khi viết, điều này để lại khả năng điều kiện chủng tộc. Không có cách nào xung quanh điều này trên NFS; mỗi nhà văn song song cần phải viết tập tin riêng của mình. Cách duy nhất để giải quyết vấn đề này là thiết lập quy trình máy chủ trên máy chủ NFS, ghi nhật ký loggers|nc server port
và để máy chủ nối thêm dữ liệu đến vào nhật ký.