mv เป็นอะตอมบน fs ของฉันหรือไม่


13

ฉันจะตรวจสอบว่าmvอะตอมของ fs (ext4) ของฉันได้อย่างไร?

ระบบปฏิบัติการคือ Red Hat Enterprise Linux Server รีลีส 6.8

โดยทั่วไปฉันจะตรวจสอบสิ่งนี้ได้อย่างไร ฉันได้ดูไปรอบ ๆ และไม่พบว่าระบบปฏิบัติการของฉันเป็น POSIX มาตรฐานหรือไม่


คุณเคยลองstraceไหม
Wildcard

คำตอบ:


9

น่าสนใจพอดูเหมือนว่าคำตอบอาจเป็น "ขึ้นอยู่กับ"

เพื่อความชัดเจนmvระบุให้

mvยูทิลิตี้จะดำเนินการเทียบเท่ากับrename() ฟังก์ชั่น

ข้อกำหนดฟังก์ชั่นการเปลี่ยนชื่อฯ :

นี้rename()ฟังก์ชั่นเทียบเท่าสำหรับไฟล์ปกติที่กำหนดโดยมาตรฐาน ISO C การรวมไว้ที่นี่จะขยายคำจำกัดความนั้นเพื่อรวมการกระทำในไดเรกทอรีและระบุพฤติกรรมเมื่อพารามิเตอร์ใหม่ตั้งชื่อไฟล์ที่มีอยู่แล้ว ข้อมูลจำเพาะนั้นต้องการการกระทำของฟังก์ชันนั้นเป็นอะตอม

แต่ล่าสุดข้อกำหนด ISO ISOสำหรับrename()รัฐ:

7.21.4.2 renameฟังก์ชั่น

สรุป

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

ลักษณะ

renameฟังก์ชั่นที่ทำให้เกิดไฟล์ที่มีชื่อสตริงชี้ไปตามเป็นที่รู้จักตั้งแต่บัดนี้เป็นต้นไปโดยใช้ชื่อที่กำหนดโดยสตริงชี้ไปตามold newไฟล์ที่ชื่อoldไม่สามารถเข้าถึงได้โดยชื่อนั้น หากไฟล์ที่ชื่อโดยสตริงที่ชี้ไปnewมีอยู่ก่อนการเรียกไปยังrenameฟังก์ชันการทำงานจะถูกกำหนดไว้

ผลตอบแทน

renameกลับมาทำงานเป็นศูนย์ถ้าการดำเนินการประสบความสำเร็จไม่ใช่ศูนย์ถ้ามันล้มเหลวซึ่งในกรณีนี้หากไฟล์ที่มีอยู่ก่อนหน้านี้มันเป็นที่รู้จักกันโดยยังคงชื่อเดิม

น่าแปลกที่ทราบว่าไม่มีข้อกำหนดที่ชัดเจนสำหรับอะตอมมิก อาจจำเป็นต้องใช้ที่อื่นใน C Standard ที่เผยแพร่สู่สาธารณะล่าสุด แต่ฉันไม่สามารถค้นหาได้ หากใครสามารถค้นหาข้อกำหนดดังกล่าวได้การแก้ไขและความคิดเห็นนั้นเป็นมากกว่าการต้อนรับ

ดูเพิ่มเติมเปลี่ยนชื่อ () เป็นอะตอมหรือไม่

ตามหน้าลินุกซ์ :

หากnewpathมีอยู่แล้วมันจะถูกแทนที่ด้วยอะตอมดังนั้นจึงไม่มีจุดที่กระบวนการอื่นที่พยายามเข้าถึง newpathจะพบว่าหายไป อย่างไรก็ตามอาจจะมีหน้าต่างที่ทั้งคู่oldpathและnewpathอ้างถึงไฟล์ที่ถูกเปลี่ยนชื่อ

หน้า man Linux อ้างว่าการแทนที่ไฟล์จะเป็นแบบ atomic

การทดสอบและตรวจสอบว่าอะตอมมิกซิตี้อาจเป็นเรื่องยากมากหากเป็นไปได้ว่าคุณต้องไปไกลแค่ไหน คุณไม่ชัดเจนว่าคุณหมายถึงอะไรในการใช้งาน "ฉันจะตรวจสอบได้อย่างไรว่า mv เป็นอะตอม" คุณต้องการข้อกำหนด / ข้อมูลจำเพาะ / เอกสารที่เป็นอะตอมหรือคุณต้องการทดสอบจริงหรือไม่?

หมายเหตุด้วยดังกล่าวข้างต้นถือว่าสองชื่อไฟล์ตัวถูกดำเนินการอยู่ในระบบไฟล์เดียวกัน ฉันไม่พบข้อ จำกัด มาตรฐานในmvโปรแกรมอรรถประโยชน์นี้เพื่อบังคับใช้


ฉันต้องทำให้แน่ใจว่าการเคลื่อนที่นั้นเป็นอะตอม การทดสอบเพียงพอที่จะยอมรับสิ่งนี้หรือไม่ ฉันไม่สามารถบอกได้ ใช่ฉันกำลังทำงานบน fs เดียวกัน (ext4 ถึง ext4)
Tizianoreica

1
POSIX ไม่รับประกัน atomicity อย่างใดอย่างหนึ่ง แต่ Linux เช่นเดียวกับรุ่น Unix ส่วนใหญ่ทำสำหรับระบบไฟล์ "ดั้งเดิม" เช่น ext4
Gilles 'หยุดความชั่วร้าย'

1
เนื่องจาก ISO C กำหนดพฤติกรรมของโปรแกรมเดียวเท่านั้นและไม่ใช่ทั้งระบบมันจะแปลกที่จะพูดอะไรเกี่ยวกับrenameอะตอมมิก
Gilles 'หยุดชั่วร้าย'

3
ฉันอ่าน "ข้อมูลจำเพาะนั้น" ตามที่อ้างถึงประโยคก่อนหน้า ("การรวมที่นี่ ... ระบุพฤติกรรมเมื่อพารามิเตอร์ใหม่ตั้งชื่อไฟล์ที่มีอยู่แล้ว") ซึ่งอ้างถึงส่วนก่อนหน้าของ POSIX doc ("ลิงก์ชื่อใหม่จะต้อง ยังคงปรากฏให้เห็นในเธรดอื่น ๆ ตลอด ... และอ้างถึงไฟล์ที่อ้างถึงโดยเก่าหรือใหม่ ... ") กล่าวอีกนัยหนึ่ง POSIX สัญญาว่าจะใช้มาตรฐาน ISO C และให้การรับประกันเพิ่มเติมนอกเหนือจากที่ ISO C ให้ไว้ การตีความนั้นช่วยได้หรือไม่?
SimonJ

1
@Tizianoreica ฉันรู้ว่านี่เป็นโพสต์โบราณ แต่ฉันเพิ่งเห็นความคิดเห็นของคุณและคิดว่าฉันควรชี้แจง: ระบบไฟล์จริงจะต้องเหมือนกันสำหรับการเปลี่ยนชื่อเป็นอะตอม ไม่ใช่แค่ระบบไฟล์ประเภทเดียวกัน เช่นถ้าคุณมี/ext4 fs และ ext4 fs /tmpต่างกันคุณจะไม่สามารถ mv แบบอะตอมจากที่หนึ่งไปยังอีกที่หนึ่งได้
Wodin

0

mvขึ้นอยู่กับการrenameเรียกของระบบและrename()เป็นอะตอม คุณสามารถดู rename(2)manpage

คุณสามารถหาคำตอบเกี่ยวกับการเปลี่ยนชื่อ () อะตอมหรือไม่ บน stackoverflow

คุณใช้ fs ประเภทใด


fs เป็น ext4 - os ระบุไว้แล้ว
Tizianoreica

-1

นอกเหนือจากการตรวจสอบ systemcalls และ atomicity แล้วพวกเขาอาจinotify-toolsทำหน้าที่เป็นแบบทดสอบได้ แต่ฉันไม่แน่ใจว่ามันเป็นเครื่องพิสูจน์ว่าเป็น atomicity หรือไม่

เปิด 2 shells ดูไดเรกทอรีเป้าหมายของการย้ายหนึ่งในนั้น:

inotifywait -m target/

ย้ายไฟล์ไปไว้ในไดเร็กทอรีอื่น ๆ :

mv foobar target/

inotifywaitควรจะแสดงเพียงหนึ่งบรรทัด:

target/ MOVED_TO foobar

ดูเหมือนว่าอะตอมเมื่อเปรียบเทียบกับการตอบสนองls target/และtouch target/aซึ่งผลิตข้อความหลายบรรทัดเช่น:

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

PS

ฉันคิดว่าอย่างน้อยก็แสดงให้เห็นว่าความร่วมมือแบบมัลติซิงโครนัสบนไฟล์นั้นปลอดภัยกับinotify(อะตอมจริง): ในกรณีใด ๆ ที่คุณจะตอบสนองหลังจากinotifyให้สัญญาณสุดท้ายหลังจากการดำเนินการ inotifyยกตัวอย่างเช่นการติดตั้งผู้ผลิตผู้บริโภคสามารถดำเนินการได้อย่างง่ายดายและปลอดภัยด้วย

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.