(ब्रायन डी Foy के योगदान)
वहाँ तो आप इंतजार की जरूरत नहीं है पृष्ठभूमि में कोड को चलाने के लिए एक भी तरीका नहीं है इससे पहले कि आपका प्रोग्राम अन्य कार्यों पर चलता है, इसे पूरा करने के लिए। प्रक्रिया प्रबंधन आपके विशेष ऑपरेटिंग सिस्टम पर निर्भर करता है, और कई तकनीकें perlipc में हैं।
कई CPAN मॉड्यूल IPC::Open2 या IPC::Open3, IPC::Run, Parallel::Jobs, Parallel::ForkManager, POE, Proc::Background, और Win32::Process सहित, मदद करने में सक्षम हो सकता है। ऐसे कई अन्य मॉड्यूल हैं जिनका आप उपयोग कर सकते हैं, इसलिए उन विकल्पों को अन्य विकल्पों के लिए भी देखें।
आप एक यूनिक्स की तरह सिस्टम पर हैं, तो आप एक सिस्टम कॉल जहां आदेश के अंत पर एक & डाल के साथ भाग प्राप्त करने में सक्षम हो सकता है:
system("cmd &")
तुम भी कांटा का उपयोग कर कोशिश कर सकते हैं , जैसा कि perlfunc में वर्णित है (हालांकि यह वही बात है जो कई मॉड्यूल आपके लिए करेंगे)।
STDIN, STDOUT, और STDERR
मुख्य प्रक्रिया और backgrounded एक ("बच्चे" प्रक्रिया) का हिस्सा ही STDIN, STDOUT और STDERR filehandles दोनों साझा कर रहे हैं। यदि दोनों एक बार में उन्हें एक्सेस करने का प्रयास करते हैं, तो अजीब चीजें हो सकती हैं। आप बच्चे के लिए इन्हें बंद या फिर से खोलना चाह सकते हैं। आप पाइप खोलने के साथ इसे प्राप्त कर सकते हैं (perlfunc में खुले देखें) लेकिन कुछ प्रणालियों पर इसका मतलब है कि बाल प्रक्रिया माता-पिता से बाहर नहीं जा सकती है। सिग्नल आपको सिगचल सिग्नल, और संभवतः सिगिप भी पकड़ना होगा। पृष्ठभूमि प्रक्रिया समाप्त होने पर SIGCHLD भेजा जाता है। SIGPIPE भेजा जाता है जब आप किसी फ़ाइलहेडल को लिखते हैं जिसकी बाल प्रक्रिया बंद हो जाती है (एक अप्रचलित सिगिप आपके प्रोग्राम को चुपचाप मर सकता है)। यह सिस्टम के साथ कोई मुद्दा नहीं है ("cmd &")।
Zombies
आप बच्चे प्रक्रिया "काटते" जब यह खत्म तैयार किया जाना है।
$SIG{CHLD} = sub { wait };
$SIG{CHLD} = 'IGNORE';
आप एक डबल कांटा भी उपयोग कर सकते हैं। आप तुरंत अपने पहले बच्चे के लिए प्रतीक्षा करें(), और इनिट डिमन आपके पोते के लिए बाहर निकलने के बाद इंतजार करेगा()।
unless ($pid = fork) {
unless (fork) {
exec "what you really wanna do";
die "exec failed!";
}
exit 0;
}
waitpid($pid, 0);
ऐसा करने के लिए कोड के अन्य उदाहरणों के लिए perlipc में सिग्नल देखें। लाश सिस्टम के साथ कोई समस्या नहीं है ("प्रोग &")।
का परीक्षण यहां मेरे लिए काम sorta लगता है। आप क्या खत्म करने की कोशिश कर रहे हैं? – xenoterracide
क्या यह टर्मिनल खोलने वाला है और फिर टर्मिनल में हैलो वर्ल्ड प्रिंट करना है? – xenoterracide
या क्या आप टर्मिनल खोलने के लिए बस एक एसिंक्रोनस कॉल करने की कोशिश कर रहे हैं? – xenoterracide