Python: одновременное использование os.fork (), os.pipe () и подпроцесса. Открытая проблема - PullRequest
0 голосов
/ 28 февраля 2019

По сути, у меня есть следующий сегмент кода

#!/usr/bin/env python3
import os
import sys
import subprocess
import time
import shlex
import paho.mqtt.client as paho

if __name__ == "__main__":
    r, w = os.pipe()
    processId = os.fork()
    if processId:
        # wait to ensure tshark is started appropriately
        os.close(w)
        r = os.fdopen(r,'r')
        while True:
             str = r.read()
             print("{} {}".format("Message from child: ",str))
             if str == "ok":
                 break
        print("Parent exit")
    else:
        os.close(r)
        w = os.fdopen(w,'w')
        cmd = "tshark | grep EAP"
        process = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.DEVNULL, shell=True, universal_newlines=True)
        w.write("ok")
        # send signal to parent stating tshark has started appropriately
        for output in iter(process.stdout.readline, ""):
            pass #if contains EAP packet, do something

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

А вот и мои вопросы ...

1) Труба subprocess.Popen мешает трубе, созданной из os.pipe()?
Я думал, что оба не мешалидруг с другом, так как они являются двумя отличительными наборами труб.Однако я заметил, что родительский процесс не может получить сообщение через канал чтения, и только если subprocess имеет какой-либо вывод, родительский процесс получит сообщение.Мне здесь нужна помощь ...

2) Есть ли какой-нибудь подход, который позволяет выводить из subprocess линейные данные?Я прочитал this и предположил, что возможно захватить вывод, пока subprocess все еще работает, однако он возвращает вывод только после достижения размера буфера.

3) Это хороший или плохой подход для смешивания os.pipe(), os.fork() и subprocess.Popen одновременно?Я просто не уверен, будет ли кто-то делать это или есть какие-то лучшие альтернативы?Ваша помощь будет высоко оценена :)

1 Ответ

0 голосов
/ 28 февраля 2019

Ваш str = r.read() будет читать, пока канал не закроется.Трубы потоковые, а не датаграммы.Возможно, используйте .readline() и w.write("ok\n"), чтобы он знал, когда прекратить чтение данных и возврат?

...