2009-09-04 5 views
5

मैं मुख्य पर्ल स्क्रिप्ट के साथ एक विवाद परीक्षण करने के लिए अन्य पर्ल स्क्रिप्ट को कॉल करना चाहता हूं।मैं स्वतंत्र धागे को बढ़ाने के लिए पर्ल की सिस्टम कॉल का उपयोग कैसे कर सकता हूं?

कुछ इस तरह वर्तमान में काम करता है:

system("perl 1.pl"); 
system("perl 2.pl"); 
exit; 

हालांकि, मैं इन बंद के रूप में स्वतंत्र सूत्र एक ही समय में चल रहा है किक करना चाहते हैं।

मैंने कोशिश की, मेरे Google खोजों पर आधारित, कुछ इस तरह कर रही है:

system(1, "perl 1.pl"); 
system(1, "perl 2.pl"); 
exit; 

कि काम नहीं करता। मुख्य लिपि तुरंत मौजूद है, जो ठीक है, लेकिन अंतर्निहित धागे जो मैं पैदा करना चाहता हूं उसे लात मारना नहीं है। मैं सोच रहा था कि अगर मुझे कुछ और करना है या किसी और ने ऐसा कुछ किया है।

अग्रिम में किसी भी मदद के लिए धन्यवाद।

+1

आप धागे या प्रक्रियाओं करना चाहते हैं? पर्ल का 'सिस्टम()' फ़ंक्शन एक उप-प्रक्रिया बना रहा है (और अगले पर्ल स्टेटमेंट को निष्पादित करने से पहले इसकी समाप्ति का इंतजार कर रहा है। ये सिस्टम 'सिस्टम (1, ...)' को अर्थपूर्ण (फोर्क(), फिर "perl ..." के तर्क के साथ "1" नामक कुछ कथित कार्यक्रम को निष्पादित करें) यदि आप उप-प्रक्रियाएं चाहते हैं, तो इस प्रश्न से "धागे" टैग को हटा दें। –

उत्तर

13
use threads; 
$thr1 = threads->create('msc', 'perl 1.pl'); 
$thr2 = threads->create('msc', 'perl 2.pl'); 

$thr1->join(); 
$thr2->join(); 

sub msc{ ## make system call 
    system(@_); 
} 

यह दोनों बाहर निकलने से पहले निष्पादन समाप्त करने के लिए इंतजार करेगा। मुझे लगता है कि यह वही है जो आप अपने मूल प्रश्न से चाहते हैं, है ना? यदि कोई टिप्पणी छोड़ने के लिए स्वतंत्र महसूस न करें और अपनी पोस्ट को बेहतर तरीके से समझाने के लिए संपादित करें, और मैं फिर कोशिश करूंगा।

+3

आपको वास्तव में '$^पीएटीएच में 'perl' पर गिनने के बजाय एक्स' –

+0

संदर्भ से दैवीय होना मुश्किल नहीं है, लेकिन मैंने $^एक्स देखा: अंग्रेज़ी के उपयोग के तहत यह $ EXECUTABLE_NAME है - "वर्तमान नाम को निष्पादित करने के लिए उपयोग किया जाने वाला नाम पर्ल " –

3

ऐसा करने के लिए कांटा कमांड का उपयोग करें, या इसे खोल स्क्रिप्ट से करें।

nohup perl 1.pl & 
nohup perl 2.pl & 
exit 

और पर्ल आदेश दिखाई देगा::

if (! fork()) 
{ 
    system("perl 1.pl"); 
} 
if (! fork()) 
{ 
    system("perl 2.pl"); 
} 

ऐसा करने के लिए बेहतर तरीके, एक स्क्रिप्ट में विवाद अर्थ लिखने का उपयोग कर रहे हैं खोल स्क्रिप्ट (यूनिक्स केवल) कुछ ऐसा दिखाई देगा perl, लेकिन यह काम करेगा। सुनिश्चित करें कि आपके मूल स्क्रिप्ट में आप SIG_CHLD फ़ंक्शन में प्रतीक्षा() में जोड़ते हैं। आप इस तरह की घटनाओं को संभालने पर अधिक जानकारी प्राप्त कर सकते हैं। जबकि सिस्टम ("perl 1.pl &"); काम कर सकता है (मैंने इसका परीक्षण नहीं किया है), मुझे लगता है कि फोर्किंग और इंतजार करना बहुत मूल्यवान संसाधन है जिसका उल्लेख नहीं किया जाना चाहिए।

+1

अधिक जानकारी के लिए: http://search.cpan.org/dist/perl/pod/perlipc.pod – Horus

+0

यह मानता है कि आप ऐसे मंच पर हैं जो नोहुप का समर्थन करता है ... – Kev

+0

आप तब भी फोर्क कर सकते हैं। –

2

Parallel::ForkManager CPAN पर पर एक नज़र डालें - सूत्रण के लिए एक neater इंटरफ़ेस है, जो आपको बस इतना करना देख रहे हैं कि वास्तव में क्या करना चाहिए प्रदान करता है;)

4

आप आप के लिए कमांड चलाने के लिए प्रक्रियाओं बंद fork कर सकते हैं। यदि आप करते हैं, तो आप शायद system के बजाय exec उपयोग करना चाहते हैं जाएगा:

#!/usr/bin/perl 

use strict; 
use warnings; 

die "could not fork: $!" unless defined (my $first_pid = fork); 

#first child 
exec $^X, "1.pl" unless $first_pid; 

die "could not fork: $!" unless defined (my $second_pid = fork); 

#second child 
exec $^X, "2.pl" unless $second_pid; 

waitpid $first_pid, 0; #wait for first child to finish 
waitpid $second_pid, 0; #wait for second child to finish 

यह भी देखें: $^X और waitpid

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

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