2010-05-25 5 views
6

तो ing पर्ल में मरने के लिए एक बच्चे के लिए इंतज़ार कर fork() के इस तुच्छ उदाहरण पर विचार करें:

#!/usr/bin/perl 

use strict; 
use warnings; 

if (fork() == 0) { 
     exit(1); 
} 

waitpid(-1,0); 

print $?; 

Solaris 10 पर स्क्रिप्ट चल रही है मैं इस परिणाम मिलता है:

$ perl test.pl 
256 

मैं कर रहे हैं के मूल्यों पर शक ऊपर की तरफ स्थानांतरित किया जा रहा है क्योंकि जब मैं बच्चे में exit(2) करता हूं, तो आउटपुट 512 बन जाता है।

मुझे यह प्रतीत होता है कि यह पेर्ल के waitpid में प्रलेखित नहीं है। क्या यह मेरे सिस्टम पर एक बग है या क्या मैं कुछ गलत कर रहा हूं?

उत्तर

23

यह perlvar मैन पेज के $? अनुभाग में प्रलेखित है।

यानी असली निकास कोड $? >> 8 है।

+9

यह भी [perldoc -f system] (http://perldoc.perl.org/functions/system.html) में शामिल है। – Ether

1

बच्चे को शायद exit पर कॉल करने के लिए भी नहीं मिला हो सकता है। इस प्रकार, $? केवल exit पैरामीटर से अधिक जानकारी पैक करता है।

if ($? == -1 ) { die "Can't launch child: $!\n"; } 
elsif ($? & 0x7F) { die "Child killed by signal ".($? & 0x7F)."\n"; } 
elsif ($? >> 8 ) { die "Child exited with error ".($? >> 8)."\n"; } 
else    { print "Child executed successfully\n"; } 

यह system के दस्तावेज में अधिक स्पष्ट रूप से प्रलेखित है।

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