Как захватить стандартный вывод дочернего процесса, используя только fork / exec / pipe / dup2?

#python #python-3.x #pipe #fork

#python #python-3.x #канал #fork

Вопрос:

итак, я пытаюсь захватить вывод дочернего процесса, используя только fork / exec / pipe / dup2, но вместо этого вывод продолжает выводиться на терминал. Это мой код прямо сейчас:

 import os
import sys

pipeIn, pipeOut = os.pipe()
processid = os.fork()
if processid == 0:
    try:
        os.close(pipeIn)
        os.dup2(pipeOut, 0)
        os.execv(sys.executable, [sys.executable, 'helloWorld.py'])
        sys.exit(0)
    except FileNotFoundError:
        print("ERROR: File not found.")
        sys.exit(1)
elif processid == -1:
    print("ERROR: Child was unable to run.")
    sys.exit(1)
else:
    wait = os.wait()
    if wait[1] == 0:
        os.close(pipeOut)
        output = os.read(pipeIn, 100)
    else:
        output = "ERROR"
 

Кто-нибудь может сказать мне, что происходит не так? И как я могу захватить вывод команды exec вместо того, чтобы печатать его на терминале. (Временные файлы также не разрешены).

Ответ №1:

Стандартный вывод — FD 1, но вместо этого вы используете dup свой канал через FD 0 (стандартный ввод). Измените os.dup2(pipeOut, 0) на os.dup2(pipeOut, 1) .