น่าสนใจพอดูเหมือนว่าคำตอบอาจเป็น "ขึ้นอยู่กับ"
เพื่อความชัดเจน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โปรแกรมอรรถประโยชน์นี้เพื่อบังคับใช้
straceไหม