2010-10-13 23 views
5

मैंने फोर्क() के साथ सिस्टम() का उपयोग करने का प्रयास किया है, निष्पादन() की कोशिश की है, और अभी भी मुझे जो चाहिए वह नहीं मिल रहा है।मैं बाहरी विंडोज कमांड कैसे निष्पादित कर सकता हूं और तुरंत पर्ल में वापस आ सकता हूं?

मैं एक पर्ल स्क्रिप्ट लिखना चाहता हूं जो निष्पादित करता है, मान लीजिए, पंक्ति में 5 बार एक अलग पर्ल स्क्रिप्ट (इसे विभिन्न पैरामीटर मान भेजना), लेकिन यह एक साथ चल रहा है। मुझे लगता है मैं एक .pm फ़ाइल में मेरी स्क्रिप्ट कर देते हैं और इसे संदर्भ लेकिन मैं माता पिता के बच्चे स्क्रिप्ट स्वतंत्र रखना चाहते हैं सकता है ...

  • प्रणाली() काम करता है, लेकिन लगातार आदेशों को निष्पादित करता है (बनाता है भावना दस्तावेज़ के अनुसार)
  • कार्यकारी() काम नहीं करता है - यह केवल कार्यान्वित पहली विधि (प्रति डॉक समझ में आता है)
  • मैं एक कांटा() बच्चे पर्ल स्क्रिप्ट को जोड़ा गया और फिर प्रणाली का उपयोग करने की कोशिश की ()
  • यह या तो काम नहीं करता था।
  • बैकटिक आदेश 'दस्तावेज कहते हैं कि यह प्रणाली() के रूप में ही काम करता है ...

वहाँ पर्ल (WindowsXP का उपयोग कर im) में एक आसान तरीका एक प्रक्रिया पर अमल, और नहीं के बारे में परवाह नहीं है मूल्यों या आंखों को वापस करें और केवल मूल लिपि की अगली पंक्ति में जारी रखें?

+1

पोस्ट कुछ कोड है, तो हम काम नहीं किया क्या देख सकते हैं। – Ether

उत्तर

8

विंडोज़ पर, आप सिस्टम, आईआईआरसी को सुपर-गुप्त 1 ध्वज दे सकते हैं।

system 1, @cmd; 

perlmonks पर इस प्रश्न के लिए एक त्वरित गूगल खोज देता है: http://www.perlmonks.org/?node_id=639814

आशा है कि मदद करता है।

+0

यह कमाल काम किया। धन्यवाद। पहली बार perl का उपयोग, यह महान काम करता है। मेरी टिप्पणी के बाद उत्तर देने वाले सभी लोगों के लिए धन्यवाद – dferraro

+0

@dferraro => पर्ल की जादुई भूमि में आपका स्वागत है, आशा है कि आप अपने प्रवास का आनंद लेंगे। आम तौर पर, मैं अनुशंसा करता हूं कि यदि आप अधिक सामान्य समाधान मौजूद हैं तो आप ऑपरेटिंग सिस्टम विशिष्ट समाधान से दूर रहें। आप कभी भी नहीं जानते कि आपको एक अप्रत्याशित मंच पर काम करने के लिए स्क्रिप्ट की आवश्यकता होगी। –

+0

स्वागत के लिए धन्यवाद ... मैं अब नरक की तरह भागना चाहता हूं। मैंने अभी भी पेर्ल की एक पंक्ति नहीं देखी है जिसने मुझे 5 मिनट तक का सामना नहीं किया;) – dferraro

2

आपको माता-पिता में फोर्क करने की आवश्यकता है, फिर नई प्रक्रिया में निष्पादित करें। यह इस तरह से चला जाता है, एक संभालने मूल स्क्रिप्ट है, और बी एक आप 5 बार क्या करना चाहते है:

   A1 
fork in A1 -> A1 A2 
exec B in A2 -> A1 B2 
fork in A1 -> A1 A3 B2 
exec B in A3 -> A1 B3 B2 

आदि

+0

मैं माता-पिता में कैसे जा सकता हूं? कांटा पैराम नहीं लेता है, तो मैं इसे कैसे कहूं निष्पादित करने के लिए ... – dferraro

+0

आप पहले ['fork'] (http://perldoc.perl.org/functions/fork.html) को कॉल करते हैं। यह दिखाए गए प्रक्रिया को डुप्लिकेट करता है, फिर 'फोर्क' दो बार लौटाता है। फिर आप यह निर्धारित करने के लिए रिटर्न वैल्यू का उपयोग करते हैं कि आप किस प्रक्रिया में हैं। यदि यह शून्य है, तो यह माता-पिता है; अगर 0, तो बच्चा। फिर, बच्चे में, आप ['exec'] (http://perldoc.perl.org/functions/exec.html) को कॉल करते हैं। एरिक ने एक संक्षिप्त उदाहरण प्रदान किया। –

12

आप इसे इस (मूल में कांटा की तरह कर सकते हैं, कार्यकारी बच्चे में):

कि exec $cmd unless fork
for my $cmd qw(command1 command2 command3) { 
     exec $cmd unless fork 
} 

तरह से काम करता है यह है कि fork (प्रक्रिया आईडी) माता-पिता में एक सही मूल्य वापस आ जाएगी और बच्चे में एक झूठी मान प्रदान करेंगे, इस प्रकार exec $cmd केवल तभी fork चलाने हो जाता है झूठा लौटाता है (ए का, बच्चे में)।

या आप इस प्रक्रिया पर नजर रखना चाहते हैं के रूप में यह समवर्ती चलाता है:

my @procs; 

for my $cmd qw(cmd1 cmd2 cmd3) { 

    open my $handle, '-|', $cmd or die $!; 

    push @procs, $handle; 
} 

तो आप @procs का एक तत्व से पढ़ सकते हैं अगर आप की जरूरत है।

या Forks::Super जैसे कई सीपीए मॉड्यूल में से एक को देखें जो कांटा प्रबंधन के विवरण को संभालते हैं।

+0

बस ध्यान रखें कि विंडोज़ पर कांटा() में कुछ जटिलताएं हैं, और चूंकि खुले बस कवर के नीचे एक कांटा है, आप उन्हें वहां भी देखेंगे। – Tanktalus

2

इस मॉड्यूल के लिए एक मॉड्यूल अधिक है। नई प्रक्रिया बनाने के लिए आप fork और नई प्रक्रिया में कमांड चलाने के लिए exec चाहते हैं।पांच कमांड चलाने के लिए, आपको कुछ चाहिए:

for (my $i=0; $i<5; $i++) { 
    if (fork() == 0) { 
     exec($command[$i]); # runs command, doesn't return 
    } 
} 
+0

यदि आप क्रॉस-प्लेटफॉर्म व्यवहार चाहते हैं तो एक मॉड्यूल अधिक नहीं है जो सभी प्लेटफॉर्म-विशिष्ट व्यवहार को छुपाता है जो विंडोज पर फोर्क इम्यूलेशन लाता है । एक (उम्मीद है) सरल इंटरफ़ेस के पीछे छिपाने की जटिलता मॉड्यूल के उद्देश्यों में से एक है। – Tanktalus

+1

यदि आपके पास संस्करण 5.8 या बाद का संस्करण है, तो विंडोज़ पर कांटा और निष्पादन में कुछ भी गलत नहीं है। –

3

एक बहुत हल्का दृष्टिकोण।

विंडोज:

foreach my $cmd (@cmds) 
{ 
    `start $cmd`; 
} 

यूनिक्स:

foreach my $cmd (@cmds) 
{ 
    `$cmd &`; 
} 
+0

मैंने इस कारण को आजमाया, यह भी आसान लग रहा था, लेकिन उसने किसी कंसोल विंडो को नहीं खोल दिया और फिर आखिरी निष्पादन पर लटका दिया ...? – dferraro

+0

आम तौर पर, मैं खोल से बचने के लिए बैकटिक्स से बचना पसंद करता हूं। विशेष रूप से विंडोज़ पर जहां $ cmd में रिक्त स्थान हो सकते हैं। – Tanktalus

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

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