2016-12-17 7 views
1

У меня есть этот код для fork дочерний процесс от родительского процесса и я знаю, что:как раскошелиться дочерний процесс от дочернего процесса соответственно

os.fork() создает копию предыдущей сессии Python и открывает его параллельно , и os.fork() возвращает идентификатор нового процесса.

Я хочу разбить дочерний процесс из дочернего процесса, но всегда он разветвляется из родительского процесса. Как это можно сделать.

import os 

def child(): 
    print('this is child', os.getpgid()) 
    os._exit() 

def parent(): 
    while True: 
     newpid = os.fork() 
     if newpid ==0: 
      child() 

     else: 
      pids = (os.getpid(), newpid) 
      print("parent: %d, child: %d\n", pids) 
      reply = input("q for quit/c for new fork\n") 
      if reply == 'c': 
       continue 
      else: 
       break 

parent() 

выход выше кода:

parent: %d, child: %d 
(1669, 3685) 
q for quit/c for new fork 
c 
parent: %d, child: %d 
(1669, 3686) 
q for quit/c for new fork 
c 
parent: %d, child: %d 
(1669, 3688) 
q for quit/c for new fork 
c 
parent: %d, child: %d 
(1669, 3689) 
q for quit/c for new fork 
q 
+0

'Я хочу, чтобы раскошелиться дочерний процесс от ребенка process' Так почему бы не попробовать? Сейчас ваш дочерний процесс печатает только сообщение и завершает работу. –

ответ

0

Благодаря астры и chrk. После того, как я прочитал ответы и немного поиграл, я закончил с этим. Я использовал os.wait().

import os 

reply = int(input("Enter no of proc: ")) 
pid = 0 

for i in range(reply): 

    if pid == 0: 
     pid = os.fork() 

if pid != 0: 
    os.wait() 
    print("PID = {}, PPID = {}".format(os.getpid(), os.getppid())) 

И результат для num_process = 3 является:

Enter no of proc: 3 
PID = 49312, PPID = 49311 
PID = 49311, PPID = 49309 
PID = 49309, PPID = 20928 
0

Если вы звоните вилку() еще раз с ребенком, то возвращаемое значение будет не 0 для ребенка первого уровня и 0 для ребенка второй уровень (ребенок ребенка).

Без попытки:

def child(): 
    print('this is child', os.getpid()) 
    if os.fork() == 0: 
     print('this is a grand child', os.getpid()) 
    os._exit(0) 

Выход:

('parent: %d, child: %d\n', (9663, 9664)) 
('this is child', 9664) 
('this is a grand child', 9665) 
+0

Я добавляю это в код, но результат тот же! – samanv

+0

Локально он работает. Я отредактировал свой ответ, чтобы исправить опечатку и отобразить вывод. 'os.fork()' равно 0 в дочернем, а не в родительском процессе. – AsTeR