2012-03-01 11 views
10

क्या आप निम्नलिखित perl कोड स्निपेट के बारे में अच्छी व्याख्या प्रदान कर सकते हैं। मुझे Google से कुछ विचार मिला लेकिन अभी भी बहुत सारे बुनियादी भ्रम हैं। बहुत मदद आप इसे

$exit_value = $? >> 8; 
$signal_num = $? & 127; 
$dumped_core = $? & 128; 

उत्तर

12

का हवाला देते हुए The Doc:

$?

अंतिम पाइप क्लोज़, बैकटिक (``) कमांड, द्वारा लौटाई गई स्थिति,() या waitpid(), या सिस्टम() ऑपरेटर से प्रतीक्षा करने के लिए सफल कॉल द्वारा लौटाई गई स्थिति। पारंपरिक यूनिक्स प्रतीक्षा() सिस्टम कॉल (या अन्यथा इसे देखने के लिए बनाया गया है) द्वारा लौटाया गया यह 16-बिट स्थिति शब्द है। इस प्रकार, सबप्रोसेस का निकास मूल्य वास्तव में ($? >> 8) है, और $? देता है जो सिग्नल, यदि कोई हो, प्रक्रिया से मृत्यु हो गई, और $? & 128 रिपोर्ट चाहे कोर डंप था।

>> 8 हमें 16-बिट शब्द का उच्च बाइट देता है।

& 127 अनिवार्य रूप से & 0b01111111 जैसा ही है, जो उस शब्द के निचले 7-बिट हिस्से को दे रहा है।

& 128& 0b10000000 जैसा ही है, जो मूल रूप से परिणाम के 8 वें बिट की जांच कर रहा है।

6

देखें perldoc -f system पर छोटे नोटों प्रदान कर सकते हैं:

if ($? == -1) { 
    print "failed to execute: $!\n"; 
} 
elsif ($? & 127) { 
    printf "child died with signal %d, %s coredump\n", 
     ($? & 127), ($? & 128) ? 'with' : 'without'; 
} 
else { 
    printf "child exited with value %d\n", $? >> 8; 
} 

$? अर्थ विज्ञान wait सिस्टम कॉल से लिया जाता है, man 2 wait देखते हैं।

+0

मैं '$ के बारे में कुछ और आगे जाऊंगा? >> 8', क्योंकि यह अंतिम 8 बिट आमतौर पर एक हस्ताक्षरित मान होता है: '($ निकास) = अनपैक (" सी ", पैक (" एस ", ($? >> 8)))। – Ouki

+0

@ ओकी, 'पैक "एस" '16-बिट मान की अपेक्षा करता है, लेकिन मुझे ईमानदारी से संदेह है कि' $? >> 8' 16-बिट्स है (क्योंकि इससे पूरे नंबर 3 बाइट लंबे होंगे)। लेकिन मान लें कि यह एक सेकंड के लिए है। फिर आप 16 बिट्स में से 8 को अनपॅक करके संख्या को दूषित करते हैं। वह कोड गलत है। – ikegami

+0

यह नहीं है, लेकिन 'पैक (" सी ", ($? >> 8)) 'आपको एक चेतावनी मिलेगा। – Ouki

2
use POSIX qw(WEXITSTATUS WIFEXITED); 

if(WIFEXITED($?)) { 
    print "The exit status was ", WEXITSTATUS($?), "\n"; 
} 

भी WIFSIGNALED और WTERMSIG देखें।

एक अन्य उपयोगी सी मैक्रो WCOREDUMP, के रूप में (अतिरिक्त बल के साथ)

WCOREDUMP(status)

रिटर्न सच अगर बच्चे एक कोर डंप का उत्पादन किया GNU सी पुस्तकालय में दर्ज है। WIFSIGNALED सत्य लौटाए जाने पर यह मैक्रो केवल नियोजित किया जाना चाहिए। यह मैक्रो POSIX.1-2001 में निर्दिष्ट नहीं है और कुछ यूनिक्स कार्यान्वयन (उदाहरण के लिए, AIX, SunOS) पर उपलब्ध नहीं है। केवल और नरक में संलग्न इस का उपयोग करें; #endif

version 5.10.0 के बाद से, $? के मूल्य के अपने गणना करता है, तो मैक्रो के रूप में perlvar में दस्तावेज आपके सिस्टम पर उपलब्ध है, में पर्ल includes WCOREDUMP:

इस प्रकार, उपप्रक्रिया के निकास मूल्य वास्तव में ($?>> 8) है , और $? & 127 कौन सा संकेत देता है, यदि कोई हो, तो प्रक्रिया से मृत्यु हो गई, और $? & 128 रिपोर्ट करता है कि कोर डंप था या नहीं।

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