Là mv nguyên tử trên fs của tôi?


12

Làm cách nào để kiểm tra xem có phải mvlà nguyên tử trên fs của tôi không (ext4)?

Hệ điều hành là Red Hat Enterprise Linux Server phát hành 6.8.

Nói chung, làm thế nào tôi có thể kiểm tra điều này? Tôi đã xem xét xung quanh và không tìm thấy hệ điều hành của mình là POSIX tiêu chuẩn.


Bạn đã thử stracechưa
tự đại diện

Câu trả lời:


8

Thật thú vị, có vẻ như câu trả lời có thể là, "Nó phụ thuộc".

Để rõ ràng, mvđược chỉ định để

Các mvtiện ích có trách nhiệm thực hiện hành động tương đương với rename() chức năng

Đặc tả chức năng đổi tên trạng thái:

Đây rename()hàm tương đương cho các tập tin thường xuyên để mà xác định bởi các tiêu chuẩn ISO C. Bao gồm của nó ở đây mở rộng định nghĩa đó để bao gồm các hành động trên các thư mục và chỉ định hành vi khi tham số mới đặt tên cho một tệp đã tồn tại. Đặc tả đó đòi hỏi hành động của hàm phải là nguyên tử.

Nhưng thông số kỹ thuật ISO C mới nhất cho rename()các trạng thái:

7.21.4.2 renameHàm

Tóm tắc

#include <stdio.h>
int rename(const char *old, const char *new);

Sự miêu tả

Các renamechức năng gây ra các tập tin có tên là chuỗi trỏ đến bởi oldđược từ nay về sau được biết đến với cái tên được đưa ra bởi chuỗi trỏ đến bởi new. Các tập tin được đặt tên oldkhông còn có thể truy cập bằng tên đó. Nếu một tệp được đặt tên bởi chuỗi được chỉ đến bởi newtồn tại trước lệnh gọi renamehàm, thì hành vi được xác định theo thực hiện.

Trả về

Các renamehàm trả về số không nếu các hoạt động thành công, khác không nếu nó không thành công, trong trường hợp này nếu tập tin đã tồn tại trước đây nó vẫn được biết đến bởi tên ban đầu của nó.

Đáng ngạc nhiên, lưu ý rằng không có yêu cầu rõ ràng cho nguyên tử. Nó có thể được yêu cầu ở một nơi khác trong Tiêu chuẩn C có sẵn công khai mới nhất, nhưng tôi không thể tìm thấy nó. Nếu bất cứ ai có thể tìm thấy một yêu cầu như vậy, chỉnh sửa và bình luận được chào đón nhiều hơn.

Xem thêm Có phải đổi tên () nguyên tử?

Trên trang người dùng Linux :

Nếu newpathđã tồn tại, nó sẽ được thay thế nguyên tử, do đó không có điểm nào mà quá trình khác cố gắng truy cập newpathsẽ thấy nó bị thiếu. Tuy nhiên, có lẽ sẽ có một cửa sổ trong đó cả hai oldpathnewpaththam chiếu đến tệp được đổi tên.

Trang người đàn ông Linux tuyên bố việc thay thế tệp sẽ là nguyên tử.

Tuy nhiên, việc kiểm traxác minh rằng tính nguyên tử có thể rất khó khăn, nếu đó là khoảng cách bạn cần đi. Bạn không rõ ý của bạn khi sử dụng "Làm thế nào tôi có thể kiểm tra xem mv có phải là nguyên tử không". Bạn có muốn các yêu cầu / đặc điểm kỹ thuật / tài liệu mà nó là nguyên tử, hoặc bạn cần thực sự kiểm tra nó?

Cũng lưu ý, ở trên giả sử hai tên tệp toán hạng nằm trong cùng một hệ thống tệp. Tôi có thể tìm thấy không có hạn chế tiêu chuẩn về mvtiện ích để thực thi điều đó.


Tôi phải đảm bảo rằng di chuyển là nguyên tử. Kiểm tra đủ để chấp nhận điều này? Tôi không thể nói. Có, tôi đang làm việc trên cùng một fs (ext4 đến ext4).
Tizianoreica

1
POSIX cũng không đảm bảo tính nguyên tử, nhưng Linux, giống như hầu hết các biến thể unix, đối với các hệ thống tập tin bản địa của bản gốc như ext4.
Gilles 'SO- ngừng trở nên xấu xa'

1
Do ISO C chỉ định nghĩa hành vi của một chương trình chứ không phải toàn bộ hệ thống, sẽ thật kỳ lạ khi nó nói bất cứ điều gì về renamenguyên tử.
Gilles 'SO- ngừng trở nên xấu xa'

3
Tôi đọc "đặc tả đó" khi đề cập đến câu trước ("Bao gồm ở đây ... chỉ định hành vi khi tham số mới đặt tên tệp đã tồn tại"), trong đó đề cập đến các phần trước của tài liệu POSIX ("liên kết có tên mới sẽ vẫn hiển thị cho các chủ đề khác trong suốt ... và tham chiếu đến tệp được đề cập bởi mới hoặc cũ ... "). Nói cách khác, POSIX hứa hẹn sẽ thực hiện tiêu chuẩn ISO C và đảm bảo bổ sung ngoài những gì ISO C cung cấp. Điều đó có giúp gì không?
SimonJ

1
@Tizianoreica Tôi biết đây là một bài viết cổ, nhưng tôi chỉ thấy bình luận của bạn và nghĩ rằng tôi nên làm rõ: Hệ thống tập tin thực tế phải giống nhau để đổi tên thành nguyên tử. Không chỉ cùng loại hệ thống tập tin. ví dụ: nếu bạn có /một ext4 fs và /tmpnhư một ext4 fs khác thì bạn không thể nguyên bản mv từ cái này sang cái kia.
Wodin

0

mvđược dựa trên renamecuộc gọi hệ thống và rename()là nguyên tử. Bạn có thể nhìn vào trang web rename(2).

Bạn có thể tìm thấy câu trả lời trên Isame () nguyên tử? trên stackoverflow.

Những loại fs, bạn đã sử dụng?


fs là ext4 - os đã được chỉ định.
Tizianoreica

-1

Ngoài việc kiểm tra các hệ thống và tính nguyên tử của chúng, có inotify-toolsthể có thể dùng làm thử nghiệm, mặc dù tôi không chắc đó có phải là bằng chứng bảo đảm về tính nguyên tử hay không.

Mở 2 vỏ. Xem thư mục đích của di chuyển trong một trong số họ:

inotifywait -m target/

Di chuyển một tập tin vào thư mục khác:

mv foobar target/

Chỉ inotifywaitnên hiển thị một dòng:

target/ MOVED_TO foobar

Có vẻ như nguyên tử so với phản ứng ls target/touch target/a, tạo ra các thông điệp đa dòng như:

# the response to ls target/
target/ OPEN,ISDIR 
target/ ACCESS,ISDIR 
target/ CLOSE_NOWRITE,CLOSE,ISDIR 

PS

Tôi nghĩ, ít nhất nó cho thấy sự hợp tác đa xử lý không đồng bộ trên các tệp là an toàn với inotify(thực tế là nguyên tử): trong mọi trường hợp bạn sẽ chỉ phản hồi sau khi inotifyđưa ra tín hiệu cuối cùng sau khi hoạt động. Ví dụ, thiết lập nhà sản xuất-người tiêu dùng có thể được thực hiện dễ dàng và an toàn với inotify.

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.