सवाल अनलिंक और आरएम के बीच क्या अंतर है?


आरएम से किसी भी तेजी से अनलिंक है?


58
2017-07-10 08:49


मूल


"समयपूर्व अनुकूलन प्रोग्रामिंग में सभी बुराइयों (या कम से कम इसमें से अधिकांश) की जड़ है।" - डोनाल्ड Knuth en.wikiquote.org/wiki/Donald_Knuth - chris


जवाब:


दोनों एक ही मूलभूत कार्य के लिए एक रैपर हैं जो एक है unlink() सिस्टम कॉल

उपयोगकर्तालैंड utilies के बीच मतभेदों का वजन करने के लिए।

rm(1):

  • अधिक विकल्प।
  • अधिक प्रतिक्रिया।
  • स्वच्छता की जांच
  • उपर्युक्त के परिणामस्वरूप एकल कॉल के लिए थोड़ा धीमा।
  • एक ही समय में कई तर्कों के साथ बुलाया जा सकता है।

unlink(1):

  • कम सैनिटी जांच।
  • निर्देशिका हटाने में असमर्थ।
  • रिकर्स करने में असमर्थ
  • एक समय में केवल एक तर्क ले सकते हैं।
  • इसकी सादगी के कारण एकल कॉल के लिए मामूली रूप से दुबला।
  • देने के साथ तुलना में धीमी rm(1) एकाधिक तर्क

आप इसके साथ अंतर प्रदर्शित कर सकते हैं:

$ touch $(seq 1 100)
$ unlink $(seq 1 100)
unlink: extra operand `2'

$ touch $(seq 1 100)
$ time rm $(seq 1 100)

real    0m0.048s
user    0m0.004s
sys     0m0.008s

$ touch $(seq 1 100)
$ time for i in $(seq 1 100); do rm $i; done

real    0m0.207s
user    0m0.044s
sys     0m0.112s

$ touch $(seq 1 100)
$ time for i in $(seq 1 100); do unlink $i; done

real    0m0.167s
user    0m0.048s
sys     0m0.120s

हालांकि अगर हम सिस्टम को एक अप्रचलित कॉल के बारे में बात कर रहे हैं unlink(2) फ़ंक्शन, जिसे मैं अब महसूस करता हूं शायद वह नहीं है जिसके लिए आप लेखांकन कर रहे हैं।

आप एक प्रणाली कर सकते हैं unlink() निर्देशिकाओं और फ़ाइलों पर समान रूप से। लेकिन यदि निर्देशिका अन्य निर्देशिकाओं और फ़ाइलों के लिए अभिभावक है, तो उस अभिभावक के लिंक को हटा दिया जाएगा, लेकिन बच्चों को लटका दिया जाएगा। जो आदर्श से कम है।

संपादित करें:

क्षमा करें, के बीच अंतर स्पष्ट किया unlink(1) तथा unlink(2)। मंच के बीच सेमेन्टिक्स अभी भी अलग-अलग होंगे।


61
2017-07-10 08:58



क्या इसका मतलब यह है कि यूनिक्स फाइल सिस्टम में एक निर्देशिका को हटाने और इसके अंतर्गत सभी फाइलें हमेशा एक ऑपरेशन होगी जो फाइलों / डीआईआर की संख्या के अनुपात में आनुपातिक है? जब ऐसा होता है जब मैं ऐसी निर्देशिका को अनलिंक करता हूं जो अन्य डीआईआर / फाइलों के लिए माता-पिता है? यह कभी खत्म नहीं हो जाता है और मैं इस जगह को हमेशा के लिए खो दिया? - Marcin
यह तकनीकी रूप से संभव है अगर सभी फाइल सिस्टम नहीं तो सबसे अधिक अनाथ निर्देशिका / फ़ाइलें छोड़ दें। इसे ठीक करने का मतलब आमतौर पर एक फाइल सिस्टम मरम्मत उपकरण चलाना है। यूनिक्स / लिनक्स पर इन उपकरणों को 'fsck' के रूप में जाना जाता है और विभिन्न फ़ाइल सिस्टम के लिए कुछ विशिष्ट विविधताएं होती हैं। अगर वे कुछ ठीक करते हैं तो वे आम तौर पर इसे 'खोए + पाए गए' नामक निर्देशिका में छोड़ देंगे। - ConcernedOfTunbridgeWells
सही बात। आरएम पेड़ के नीचे से रिकर्स करेगा। आप दिखा सकते हैं कि कैसे: mkdir -p 1/2/3; touch 1/one 1/2/two 1/2/3/three; rm -ri 1। यदि आपने मूल निर्देशिका को अनलिंक किया है तो बच्चों द्वारा खपत की गई जगह को तब तक खो जाना चाहिए जब तक कि fsck विसंगति पाता है। - Dan Carley
तुम्हारी किस बारे में बोलने की इच्छा थी? $ mkdir -p 1/2/3 $ 1 अनलिंक अनलिंक करें: '1' को अनलिंक नहीं कर सकता: क्या एक निर्देशिका उपयोगकर्ता "स्मृति" रिसाव को fsck की आवश्यकता होती है? संभावना नहीं! - Thomas
लिनक्स और फ्रीबीएसडी दोनों मैनपेज स्पष्ट रूप से बताते हैं कि निर्देशिका पर अनलिंक () चलाने की कोशिश करते समय यह असफल हो जाएगा। - Thomas


POSIX spec स्तर पर, क्या rm क्या करता है उससे ज्यादा कसकर निर्दिष्ट किया जाता है उतारना कर देता है।

यदि आपकी स्क्रिप्ट को ओएस के पार चलाना है, तो परिणाम की पोर्टेबिलिटी आरएम का उपयोग करके बेहतर होने की संभावना है।


6
2017-07-10 12:44





निकालने का धीमा हिस्सा फाइल सिस्टम कोड और डिस्क सामान है, न कि अनइंक () सिस्टम कॉल की उपयोगकर्ता स्पेस तैयारी।

I.e: यदि गति अंतर मायने रखता है, तो आपको फ़ाइल सिस्टम पर डेटा संग्रहित नहीं करना चाहिए।

अनलिंक सिर्फ एक आरएम "प्रकाश" है। आरएम में अधिक सुविधाएं हैं लेकिन वे वही काम करते हैं।


4
2017-07-10 11:46