2012-05-21 4 views
9

Просто интересно, может ли кто-нибудь помочь мне. Проблема, с которой я сталкиваюсь, заключается в том, что я os.fork(), чтобы получить несколько бит информации и отправить их в файл, но проверяя, не работает ли процесс вилки.Python проверяет, завершен ли процесс 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/###/не является хорошим решением. Как проблемы PID не определены. После того, как ваш ребенок будет завершен, начнется следующий процесс (который может быть полностью независим от вашего приложения) * может * получить тот же PID. Как правило, они выдаются с переходом, поэтому с текущими ядрами ваше решение будет работать, скорее всего, все время, но вы не можете быть уверены в будущих версиях ядра или в особых случаях, например, когда вы помещаете компьютер в спящий режим, или если ваш приложение задерживается на некоторое время из-за нехватки сети, не отвечающего сервера или аналогичного. – Alfe

ответ

12

Чтобы дождаться завершения дочернего процесса, используйте одну из функций os.waitXXX(), например os.waitpid(). Этот метод является надежным; в качестве бонуса он предоставит вам информацию о статусе.

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) 
Смежные вопросы