2012-07-05 13 views
6

क्यूएनएक्स (न्यूट्रीनो 6.5.0) केश के खुले स्रोत कार्यान्वयन का उपयोग अपने खोल के रूप में करता है। सिस्टम स्टार्टअप स्क्रिप्ट सहित प्रदान की स्क्रिप्ट, का एक बहुत, उपयोग एक संसाधन प्रबंधक मौजूद है या फाइल सिस्टम में नहीं है कि क्या"test -a file" और "test file -ef फ़ाइल" के बीच अंतर

if ! test /dev/slog -ef /dev/slog; then 
    # do something 
fi 

जाँच करने के लिए इस तरह के रूप निर्माण करती है। मैंने खोज की है और केवल बहुत ही स्प्रे स्पष्टीकरण मिल सकता है कि -ef यह देखने के लिए जांच करता है कि दो पैरामीटर वास्तव में एक ही फाइल हैं या नहीं। चूंकि निर्दिष्ट फ़ाइल नाम वही है, यह जांचने के लिए कि फ़ाइल मौजूद है, बस यह कम हो जाती है।

मैंने test -a और test -e के व्यवहार की जांच की है (दोनों मेरे द्वारा पढ़े गए विभिन्न दस्तावेज़ों के अनुसार किसी भी प्रकार की फ़ाइल के फ़ाइल अस्तित्व की जांच करने लगते हैं) और वे भी काम करते हैं।

-ef और -a/-e के बीच किए गए चेक में कोई अंतर है? -ef फ़ाइल के अस्तित्व में दौड़ की स्थिति के खिलाफ सुरक्षा के लिए किसी तरह का प्रयास कर रहा है?

+0

की टिप्पणियों से भी सच है, ऐसा लगता है कि यह जांच कर सकता है कि फ़ाइल दो अलग-अलग स्टेट() कॉल के लिए मौजूद है। क्या/dev प्रविष्टि को ड्राइवर/प्रबंधक द्वारा हटा दिया जाता है (उदा।, शट डाउन होने के बाद) केवल तभी जब कोई इसके अस्तित्व की जांच करता है? – jhfrontz

+0

@jhfrontz: मुझे पूरी तरह से यकीन नहीं है कि आपका क्या मतलब है लेकिन (उदाहरण के रूप में)/dev/slog छद्म डिवाइस केवल ड्राइवर को मारने पर हटा दिया जाता है जो आम तौर पर कॉल के मध्य में 'test' के लिए नहीं होता है यह प्रारंभिक सिस्टम स्टार्टअप स्क्रिप्ट का हिस्सा है।/Dev/slog के सामान्य मामले में एक फ़ाइल फ़ाइल/कंसोल/मेमोरी पर लॉग इन करने के लिए डिवाइस को लिख सकती है, और जब यह एक अलग फ़ाइल नाम के साथ समाप्त हो सकती है, तो डिवाइस/dev में प्रकट डिवाइस पहले जैसा ही होना चाहिए/dev/slog को लिखें। – tinman

+0

मैं अनुमान लगा रहा हूं कि डिवाइस के स्टेटस के कुछ दुष्प्रभाव हैं (उदाहरण के लिए, चालक/प्रबंधक को कुछ प्रकार के हाउसकीपिंग करने के लिए प्रेरित करना) जैसे कि पहली स्टेट() कॉल ('test' से) पूर्ण हो जाती है, फ़ाइल/डिवाइस को ड्राइवर द्वारा हटा दिया गया/प्रतिस्थापित किया गया है - इस प्रकार दूसरी स्थिति() को अलग-अलग जानकारी प्राप्त करने का कारण बनता है, जिससे बदले में 'test' विफल हो जाता है। यह थोड़ी देर के बाद से मैंने क्यूएनएक्स का उपयोग किया है, लेकिन [स्लगर मैन पेज] (http: //www.qnx।कॉम/डेवलपर्स/डॉक्स/6.3.0SP3/न्यूट्रीनो/​​यूटिलिटीज/एस/स्लोगर.html) सुझाव देते हैं कि/dev/slog (उदा।, इसे अनलिंक करने से लॉग को शुद्ध करने के साथ) से दुष्प्रभाव होते हैं। – jhfrontz

उत्तर

4

strace की समीक्षा ksh की उबंटू लिनक्स की प्रति पर कोई महत्वपूर्ण अंतर नहीं बताती है। एक कॉल stat बनाम दो।

$ strace test /tmp/tmp.geLaoPkXXC -ef /tmp/tmp.geLaoPkXXC 

इस से पता चला है:

mmap(NULL, 7220736, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f11dc80b000 
close(3)        = 0 
stat("/tmp/tmp.geLaoPkXXC", {st_mode=S_IFREG|0600, st_size=0, ...}) = 0 
stat("/tmp/tmp.geLaoPkXXC", {st_mode=S_IFREG|0600, st_size=0, ...}) = 0 
close(1)        = 0 
close(2)        = 0 

... जबकि

$ strace test -a /tmp/tmp.geLaoPkXXC 

इस से पता चला है:

fstat(3, {st_mode=S_IFREG|0644, st_size=7220736, ...}) = 0 
mmap(NULL, 7220736, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f6b49e2b000 
close(3)        = 0 
stat("/tmp/tmp.geLaoPkXXC", {st_mode=S_IFREG|0600, st_size=0, ...}) = 0 
close(1)        = 0 
close(2)        = 0 

एक stat दो बनाम।

$ ksh --version 
    version   sh (AT&T Research) 93u 2011-02-08 
1

हम नहीं जानते कि कोड कोड के बिना बिल्कुल सही स्थिति का उपयोग कैसे करता है, हमें कोड के माध्यम से अंतर खोजने की आवश्यकता है।

/* code for -ef */ 
return (stat (argv[op - 1], &stat_buf) == 0 
        && stat (argv[op + 1], &stat_spare) == 0 
        && stat_buf.st_dev == stat_spare.st_dev 
        && stat_buf.st_ino == stat_spare.st_ino); 


/* code for -e/-a */ 
    case 'a':     /* file exists in the file system? */ 
    case 'e': 
     return stat (argv[pos - 1], &stat_buf) == 0; 

तो, अगर नाम एक ही नाम समान मान प्रदान करेंगे के साथ एक ही है और दो स्टेट() कर रहे हैं, तो, test -a/-e filetest file -ef file के समान है। हम जानते हैं कि पहली शर्त सच है, और हम जानते हैं कि दूसरी स्थिति @tinman

संबंधित मुद्दे