2012-05-21 10 views
9

बस सोच रहा है कि कोई मेरी मदद कर सकता है या नहीं। मेरी समस्या यह है कि मैं os.fork() को जानकारी के कई बिट प्राप्त करने और उन्हें एक फ़ाइल में भेजने के लिए, लेकिन यह देखने के लिए जांच कर रहा हूं कि कांटा प्रक्रिया काम नहीं कर रही है या नहीं।पाइथन जांच अगर एक कांटा() प्रक्रिया समाप्त हो जाती है

import sys 
import time 
import os 
import re 


ADDRESS = argv[1] 
sendBytes = argv[2] 


proID2 = os.fork() 
if proID2 == 0: 
    os.system('ping -c 20 ' + ADDRESS + ' > testStuff2.txt') 
    os._exit(0) 

print proID2 

finn = True 
while finn == True: 
time.sleep(1) 
finn = os.path.exists("/proc/" + str(proID2)) 
print os.path.exists("/proc/" + str(proID2)) 
print 'eeup out of it ' + str(proID2) 

मुझे लगता है कि os.path.exists() शायद उपयोग करने के लिए सही बात नहीं है।

धन्यवाद।

+1

/proc/###/के अस्तित्व की जांच करना कोई अच्छा समाधान नहीं है। पीआईडी ​​कैसे मुद्दों को परिभाषित नहीं किया जाता है। आपके बच्चे को समाप्त करने के बाद, अगली प्रक्रिया शुरू हुई (जो आपके आवेदन से पूरी तरह से स्वतंत्र हो सकती है) * * एक ही पीआईडी ​​प्राप्त कर सकती है। आम तौर पर, उन्हें एक बदलाव में जारी किया जाता है, इसलिए मौजूदा कर्नेल के साथ आपका समाधान हर समय अधिकतर काम करेगा, लेकिन आप भविष्य के कर्नेल संस्करणों या विशेष मामलों में जैसे कि आप कंप्यूटर को नींद मोड में डालते हैं, या यदि आपके मामले में सुनिश्चित नहीं हो सकते हैं नेटवर्क अंतराल, एक गैर-प्रतिक्रिया सर्वर या इसी तरह के कारण एप्लिकेशन कुछ समय तक रुक रहा है। – Alfe

उत्तर

12

बच्चे की प्रक्रिया को समाप्त करने के लिए प्रतीक्षा करने के लिए, जैसे os.waitXXX() फ़ंक्शंस का उपयोग करें। यह विधि विश्वसनीय है; बोनस के रूप में, यह आपको स्थिति की जानकारी देगा।

8

जबकि आप os.fork() और os.wait() (उदाहरण के लिए नीचे देखें) का उपयोग कर सकते हैं, तो आप subprocess मॉड्यूल से विधियों का उपयोग करके शायद बेहतर तरीके से बंद हो सकते हैं।

import os, sys 

child_pid = os.fork() 
if child_pid == 0: 
    # child process 
    os.system('ping -c 20 www.google.com >/tmp/ping.out') 
    sys.exit(0) 

print "In the parent, child pid is %d" % child_pid 
#pid, status = os.wait() 
pid, status = os.waitpid(child_pid, 0) 
print "wait returned, pid = %d, status = %d" % (pid, status) 
संबंधित मुद्दे