Я изучаю 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 родителя?