क्या मेरी fs पर mv परमाणु है?


13

अगर mvमेरे fs (ext4) पर परमाणु है तो मैं कैसे जांच सकता हूं ?

OS Red Hat Enterprise Linux सर्वर रिलीज़ 6.8 है।

सामान्य तौर पर, मैं इसे कैसे जांच सकता हूं? मैंने चारों ओर देखा है, और यह नहीं पाया कि मेरा ओएस मानक POSIX है या नहीं।


क्या आपने कोशिश की है strace?
वाइल्डकार्ड

जवाबों:


9

दिलचस्प रूप से पर्याप्त है, ऐसा लगता है कि उत्तर हो सकता है, "यह निर्भर करता है"।

स्पष्ट होने के लिए, mvनिर्दिष्ट किया गया है

mvउपयोगिता के बराबर कार्रवाई करने होंगे rename() समारोह

नाम बदलने समारोह विनिर्देश कहता है:

यह rename()फ़ंक्शन आईएसओ सी मानक द्वारा परिभाषित नियमित फ़ाइलों के बराबर है। इसका समावेश यहां उस परिभाषा को विस्तारित करता है जिसमें निर्देशिकाओं पर कार्रवाई शामिल है और व्यवहार को निर्दिष्ट करता है जब नया पैरामीटर पहले से मौजूद फ़ाइल का नाम देता है। उस विनिर्देश के लिए आवश्यक है कि फ़ंक्शन की क्रिया परमाणु हो।

लेकिन राज्यों के लिए नवीनतम आईएसओ सी विनिर्देश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 मानक में कहीं और आवश्यक हो सकता है, लेकिन मैं इसे ढूंढ नहीं पाया। यदि कोई ऐसी आवश्यकता पा सकता है, तो संपादन और टिप्पणियाँ स्वागत से अधिक हैं।

नाम भी देखें () परमाणु है?

प्रति लिनक्स आदमी पेज :

यदि newpathपहले से मौजूद है, तो इसे परमाणु रूप से बदल दिया जाएगा, ताकि ऐसा कोई बिंदु न हो जिस पर किसी अन्य प्रक्रिया का उपयोग करने का प्रयास करने से newpathयह गायब हो जाएगा। हालांकि, वहाँ शायद एक खिड़की है जिसमें दोनों हो जाएगा oldpathऔर newpathफ़ाइल को संदर्भित नाम दिया जा रहा है।

लिनक्स मैन पेज का दावा है कि फ़ाइल के प्रतिस्थापन परमाणु होगा।

परीक्षण और पुष्टि करना कि परमाणुता बहुत मुश्किल हो सकती है, हालांकि, अगर यह है कि आपको कितनी दूर जाने की आवश्यकता है। आप स्पष्ट नहीं हैं कि आपके "एमडब्ल्यू परमाणु है तो मैं कैसे जांच सकता हूं" के आपके उपयोग के रूप में आपका क्या मतलब है। क्या आप आवश्यकताओं / विनिर्देश / प्रलेखन चाहते हैं कि यह परमाणु है, या क्या आपको वास्तव में इसका परीक्षण करने की आवश्यकता है?

यह भी ध्यान रखें, ऊपर मान लिया गया दो संकार्य फ़ाइल नाम एक ही फाइल सिस्टम में कर रहे हैं। मुझे लगता है mvकि लागू करने के लिए उपयोगिता पर कोई मानक प्रतिबंध नहीं मिल सकता है।


मुझे यह सुनिश्चित करना है कि यह कदम परमाणु है। यह स्वीकार करने के लिए परीक्षण पर्याप्त है? मैं बता नहीं सकता। हां, मैं एक ही fs (ext4 से ext4) पर काम कर रहा हूं।
टिज़ियनोरिका

1
POSIX परमाणु की गारंटी नहीं देता है, लेकिन लिनक्स, अधिकांश यूनिक्स वेरिएंट की तरह, "देशी" फाइलसिस्टम जैसे ext4 के लिए करता है।
गाइल्स का SO- बुराई से दूर रहना '

1
यह देखते हुए कि आईएसओ सी केवल एक कार्यक्रम के व्यवहार को परिभाषित करता है और एक पूरे सिस्टम का नहीं, renameपरमाणु क्षमता के बारे में कुछ भी कहना अजीब होगा ।
गिल्स एसओ- बुराई को रोकना '10

3
मैंने पिछले वाक्य का उल्लेख करते हुए "उस विनिर्देश" को पढ़ा ("इसका समावेश यहाँ ... जब नया पैरामीटर पहले से मौजूद एक फ़ाइल का नाम देता है तो व्यवहार को निर्दिष्ट करता है"), जो कि POSIX doc के पूर्व भागों को संदर्भित करता है ("नया नाम दिया गया एक लिंक") अन्य थ्रेड्स के लिए दृश्यमान रहें ... या तो नए या पुराने द्वारा संदर्भित फ़ाइल में देखें ... ")। दूसरे शब्दों में, POSIX ISO C मानक को लागू करने का वादा करता है, और ISO C जो प्रदान करता है उससे परे अतिरिक्त गारंटी देता है। क्या वह व्याख्या मदद करती है?
साइमनज

1
@Tizianoreica मुझे पता है कि यह एक प्राचीन पद है, लेकिन मैंने अभी आपकी टिप्पणी देखी और सोचा कि मुझे स्पष्ट करना चाहिए: परमाणु के नाम बदलने के लिए वास्तविक फाइल सिस्टम समान होना चाहिए। एक ही प्रकार की फाइलसिस्टम नहीं। उदाहरण के लिए यदि आपके पास /एक ext4 fs और /tmpएक अलग ext4 fs के रूप में है तो आप एटोमिक रूप से एक से दूसरे में mv नहीं कर सकते
वोडिन

0

mvrenameसिस्टम कॉल पर आधारित है और rename()परमाणु है। आप मैनपेज देख सकते हैं rename(2)

आप नाम बदलकर () परमाणु पर जवाब पा सकते हैं ? स्टैकओवरफ्लो पर।

किस तरह की एफएस, आपने इस्तेमाल की?


fs ext4 - os पहले से निर्दिष्ट है।
टिज़ियानोरिका

-1

सिस्टमकॉल और उनकी परमाणुता की जांच के अलावा, शायद inotify-toolsएक परीक्षण के रूप में काम कर सकता है , हालांकि मुझे यकीन नहीं है कि यह परमाणुता का एक गारंटीकृत प्रमाण है।

2 गोले खोलें। उनमें से एक में कदम की लक्ष्य निर्देशिका देखें:

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 

पुनश्च

मुझे लगता है, कम से कम यह दिखाता है कि फाइलों पर अतुल्यकालिक बहुप्रक्रिया सहयोग inotify(व्यावहारिक रूप से परमाणु) के साथ सुरक्षित है : किसी भी मामले में आप inotifyऑपरेशन के बाद अंतिम संकेत दिए जाने के बाद ही जवाब देंगे । उदाहरण के लिए, एक निर्माता-उपभोक्ता सेटअप आसानी से और सुरक्षित रूप से लागू किया जा सकता है inotify

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.