LINUX.ORG.RU

Этот сложный форк

 ,


2

1

#!/usr/bin/python
import os
import signal
import sys
import time

lock_filename = 'master.lock'


def master_loop():
    for i in range(0, 3):
        pid = os.fork()
        with open(str(os.getpid()), "a") as f:
            f.write(str(pid)+"\n")
    while True:
        time.sleep(0.1)



def fork_loop():
    with open('f_'+str(os.getpid()), "w") as f:
        f.write("fork")
    while True:
        pass


def remove_lock(sgn, frame):
    os.remove(lock_filename)
    sys.exit(0)

if __name__ == "__main__":
    with open("s_"+str(os.getpid()), "w") as out_f:
        out_f.write(str(os.getpid()))
    master = False
    if not os.path.exists(lock_filename):
        master = True
        with open(lock_filename, "w") as out_f:
            out_f.write(str(os.getpid()))
        signal.signal(signal.SIGTERM, remove_lock)
        signal.signal(signal.SIGINT, remove_lock)
    if master:
        master_loop()
    else:
        fork_loop()

Все привет. Делаю следующую штукенцию, при запуске проги - один процесс, который мы запустили должен стать мастер процессом и делать всякие штуки, а также породить несколько форк-процессов, которые должны стать не мастерами и делать совсем другие штуки. А этот код делает ну совсем не то, тут много отладочного вывода в разные файлики, но они меня еще сильнее удивляют, там такая чепуха выводится. Почему этот код работает не правильно? Почему форки-бунтари мнят себя мастерами?

★★

Последнее исправление: Chubakur (всего исправлений: 1)

fork внутри цикла создаёт целое дерево, если не проследить и не предпринять.

kvap
()
Ответ на: комментарий от tailgunner

я его не проверяю на 0 или нет, потому что дочерние процессы вообще не должны попадать в функцию master_loop, соответственно форчить тоже не могу начать

Chubakur ★★
() автор топика
Ответ на: комментарий от tailgunner

Да, а разве порождение не начинает программу сначала? Или порожденный процесс работает с того же места откуда его форкнули?

Chubakur ★★
() автор топика
Ответ на: комментарий от Chubakur

разве порождение не начинает программу сначала?

«Порождение» fork-ом - нет.

порожденный процесс работает с того же места откуда его форкнули?

Да.

tailgunner ★★★★★
()
import time
from multiprocessing import Process


def master_loop():
    print('just rollin` yer kewler, dude...')
    time.sleep(1)

if __name__ == '__main__':
    master_process = Process(target=master_loop)
    master_process.demon = True
    master_process.start()

    master_process.join()
shty ★★★★★
()
Последнее исправление: shty (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.