为什么以及何时在新的伪终端(pty)中启动进程

时间:2019-03-25 17:31:30

标签: fork pty

我正在学习PTY,已经阅读The TTY demystifiedWhat is a "coproc"?,并按照这种模式测试了一些代码,例如asyncmake 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隔离开?

0 个答案:

没有答案