我正在学习PTY,已经阅读The TTY demystified,What is a "coproc"?,并按照这种模式测试了一些代码,例如async,make parent process fork with new pseudo-terminal (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中进行,因此需要帮助以更好地了解有关的用例和最佳实践。为什么以及何时使用伪终端。
来自此answer:
使用os.fork()创建的子进程从父进程继承stdin / stdout / stderr,而使用pty.fork()创建的子进程连接到新的伪终端。
但是仍然不清楚pty的目的是什么,只是要将孩子与父母的stdin / stdout / stderr隔离开?