почему и когда начинать процесс в новом псевдо-терминале (pty) - PullRequest
1 голос
/ 25 марта 2019

Я изучаю PTY , я прочитал TTY демистифицирован , Что такое "coproc"? и проверил некоторый код, следуя этому шаблону, например async , сделать форк родительского процесса с новым псевдотерминалом (PTY).

В долгосрочной перспективе я хотел бы понять способы асинхронного обновления приглашения. Я видел шаблоны, такие как запуск родительского процесса в фоновом режиме (worker &) с использованием zpty для кормить / читать совместный процесс, но все еще задаюсь вопросом, зачем делать это в пределах собственной pty.

Я тестировал в основном с zsh, используя это:

autoload -Uz async && async
async_init
typeset -Ag prompt_data

function zle-line-init zle-keymap-select prompt_refresh {
    PROMPT="$prompt_data[out] >> "
    zle reset-prompt
}

zle -N zle-line-init
zle -N zle-keymap-select

prompt_git(){
    sleep 3  # testing a delay
    if [ -n "$(cd $1 && git rev-parse --is-inside-work-tree 2>/dev/null)" ]; then
        git rev-parse --abbrev-ref HEAD
    fi
}

prompt_callback(){
    prompt_data[out]=$3
    prompt_refresh
}

async_start_worker 'prompt' -n
async_register_callback 'prompt' prompt_callback

prompt_precmd() {
    async_job 'prompt' prompt_git $(pwd)
}

autoload -Uz add-zsh-hook
add-zsh-hook precmd prompt_precmd

Пример работает, но все еще неясен для меня преимущества / варианты использования создания родителя, который разветвляется в новом PTY.

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

Из этого ответа :

Дочерний процесс, созданный с помощью os.fork (), наследует stdin / stdout / stderr от родительского процесса, в то время как дочерний процесс, созданный с помощью pty.fork (), подключен к новому псевдотерминалу.

Но все еще не ясно, какова цель pty, это только изолировать дочерний элемент от stdin / stdout / stderr родителя?

...