pty 和管道之间的区别

2024-04-11

我一直在从本页的示例中阅读有关 ptys 的内容:http://www.roucha.fr/tech_corner/pty_pdip.html http://www.rkoucha.fr/tech_corner/pty_pdip.html。我有两个问题:

  • 使用 pty 和使用管道之间有什么区别或最重要的区别?据我所知,两者都是用于进程间通信,但使用 pty 进程可以“将其视为普通终端”。这意味着什么?

  • 什么是“控制终端”?我读过有关它们的内容,但不明白它们到底是什么。控制终端总是分配给进程的 pty 吗?


The article http://www.rkoucha.fr/tech_corner/pty_pdip.html你提到的非常好,很难改进,但它是相当技术性的。我将尝试给出一个不太技术性的解释(请耐心等待,Unix 大师!)

A pipe只是一个单向数据通道:只能在一端写入,在另一端读取。对于双向进程间通信,您始终需要two管道。管道非常适合移动钻头,但不能用于更多用途。

A pty(伪终端)可以在两端读写,但它不仅仅是一个双向数据通道。为了理解这一点,看一下真实的终端是很有用的:在一端有一个进程读取击键并将字符发送到电传打字机或屏幕。另一端有一个真人敲击键盘并盯着上述屏幕。只有一端有文件描述符,另一端只是连接器和电缆。

从历史上看,终端已经开发了许多可以由其上运行的程序控制的属性(例如“回显模式”或“规范模式”,请参阅termios (3))此外,终端还可以让用户(通过上述连接器和电缆)发送可用于“作业控制”的信号,例如通过键入 CTRL-Z 将前台作业置于后台。

A pty就像一个真正的终端两端是文件描述符:

  • the 从端行为与真实终端完全相同:具有从端描述符的进程(“下级进程”)可以读取和写入它,但也可以设置终端属性,如回显模式或中断字符(例如 CTRL+C) 。它通常甚至不会意识到它没有连接到真实的屏幕和键盘。

  • the 主端看起来更像是键盘和电传打字机,不是由人类使用,而是由其他进程使用:任何打开主端的进程都可以对其进行写入,并且会收到回显(但前提是下级进程设置了ECHO从属设备上的属性)。它还可以(在大多数现代 unice 上)控制以从属设备作为其会话的会话控制终端),例如通过发送 CTRL+Z。

要了解什么是控制终端也就是说,考虑真实用户在真实终端登录的场景再次很有用。用户可以启动一个“会话”,即进程的集合,其中一些在前台作业,其他在后台。

为了防止混乱,控制终端(即与其关联的内核结构)会跟踪哪些进程处于前台或后台作业,以及允许哪些进程对其进行读取和写入。每当进程尝试非法操作(例如从控制终端读取的后台进程)时,操作就会失败(EIO)然后整个作业被内核停止(使用信号SIGTTIN)

这表明,就像真正的终端一样,只有 pty 的从属端才能成为控制终端,并且这个概念仅在支持作业控制的 Unix 系统上才有意义(现在是任何 Unix 系统)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

pty 和管道之间的区别 的相关文章

  • stripe 登录 zsh:未找到命令:stripe

    我正在跟进条纹文档 https stripe com docs stripe cli install当我去stripe login在步骤 2 中 我收到以下错误 zsh 找不到命令 条带 我已经执行了步骤 1 安装 stripe CLI 为
  • Windows 上的 unbuffer 程序相当于什么?

    你好根据这个帖子 https unix stackexchange com a 25375 unbuffer通过伪终端 pty 连接到命令 这使得系统将其视为交互式进程 因此不使用任何 stdout 缓冲 我想在 Windows 上使用这个
  • VSCode 上的 Pipenv:为什么终端上不显示 (pipenv)?

    我正在 VSCode Bash 终端上设置 pipelinev 虚拟环境 但它没有显示 pipenv 这使得它非常混乱 当我使用Pycharm并让它配置pipenv环境时 它会自动显示 pipenv 在项目路径之后 所以很容易判断我是否在
  • 当输出重定向到文件时,xcodebuild 会损坏测试结果输出

    我将 Jenkins 与 Xcode 插件配置为通过将测试构建操作添加到自定义 xcodebuild 参数设置来运行单元测试 有关让 Jenkins 使用 Xcode 5 运行单元测试的更多信息 请参阅此question https sta
  • 断开连接后保持 SSH 会话运行 - 过夜 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 这是对此的后续问题question https stackoverflow com questions 33041892 keep ssh
  • 通过管道从子shell获取退出代码

    我怎样才能获得退出代码wget来自子shell进程 所以 主要问题是 等于0 哪里可以 8成立 gt OUT wget q http budueba com net tee a file txt echo 0 它的工作原理无需tee 实际上
  • 为什么使用 $PATH 以及它是什么

    我对编程有点陌生 不是真的 但我仍在学习 我们不是吗 虽然我了解 Java 和 Python 并且了解 C C JS C HTML CSS 等 并且我可以在终端中很好地导航 但我不熟悉终端中的 PATH 是什么 我使用 Linux 终端和
  • VS Code 刷新集成终端环境变量,无需重新启动/注销

    如果您在 Windows 上添加 更改某些环境变量 例如 PATH 即使重新启动 VS Code 后 它也不会在 VS Code 集成终端中可用 但是 如果您从 Windows 命令提示符 Powershell 打开该终端 它将具有这些新的
  • 是否可以在由同一父进程创建的两个子进程之间建立管道(LINUX,POSIX)

    我有多个孩子由同一个父母 分叉 我尝试构建pipe所有这些子进程之间的连接就像一个链表结构 孩子 1 向孩子 2 发送数据 孩子 2 向孩子 3 孩子 N 向孩子 1 发送数据 有没有正确的方法可以做到这一点 此外 如果我在进程之间创建和通
  • VS Code 终端无法识别 PATH 变量

    我在 PATH 中添加了一个目录 但 VS Code 中的终端无法识别我尝试从该目录运行的命令 exe 终端使用 cmd 而不是 power shell 我缺少什么 重新启动我的计算机 它就工作了 显然 VS Code 无法识别这些更改
  • 使用管道的Python多进程非阻塞相互通信

    是否可以使用管道以非阻塞方式接收进程间通信 考虑以下代码 from multiprocessing import Process Pipe import time def f conn time sleep 3 conn send Done
  • Bash 中的条件管道

    我有一个过滤器 我想选择性地启用它 我想知道如何在 bash 中以干净的方式执行此操作 FILTER sort also can be empty ls FILTER cat 此代码不起作用 因为它会调用ls with and sort作为
  • Bash:在新终端中执行带有参数的命令[重复]

    这个问题在这里已经有答案了 所以我想在 bash 中打开一个新终端并执行带参数的命令 只要我只采取类似的东西ls作为命令它工作正常 但是当我采取类似的东西时route n 所以带参数的命令不起作用 代码 gnome terminal win
  • Emacs 退出终端

    在 Emacs 中运行终端模式时使用M x term using C x C o我无法切换到另一个缓冲区来继续处理事情 我知道这是可能的M x shell但使用此命令时 shell 的某些方面不起作用 less more 手册页等 我想知道
  • 编写代码以:启动 R 会话、运行 R 脚本、终止会话、重复

    我正在寻找一种简单的 设置后就忘记它 的方式 无论是作为终端中的单个参数字符串还是简单的 Java 程序 来自动执行以下操作 1 启动R会话 2 告诉 R 源 R 文件包含冗长的并行模拟代码 3 完成后终止R会话 4 开始一个新的R会话 5
  • Mac 10.8.3 上的 fltk 安装

    我正在挣扎fltk在我的 Mac 上安装 我想在Xcode 4 下载文件并解压缩后 尝试按照说明操作 2 3 Configuring FLTK Stay in your FLTK source code directory Type aut
  • Pipe 和 Tap VS 使用 ngxs 订阅

    我正在玩管道并订阅 如果我使用带有水龙头的管道 则控制台中不会登录任何内容 如果我使用订阅 它就可以工作 那么我做错了什么 import Observable from rxjs import tap take from rxjs oper
  • Windows 控制台“ESC[2J”并没有真正“清除”屏幕

    我知道这类问题经常被问到 但我认为这个问题有点不同 需要被问到 新的 Windows 控制台支持 ANSI VT100 控制代码 ANSI VT100 控制代码 http www termsys demon co uk vtansi htm
  • 从重定向到日志文件的程序输出中删除进度条

    我正在运行一个程序 它会输出进度条 我是这样做的 python train py tee train log The train log看起来像下面这样 这是1号线 Training 这是2号线 000 valid 100 2630 263
  • 如何清除整个终端(PowerShell)

    我有一个问题 在powershell中使用clear或cls命令仅清除终端的可见部分 我想知道如何清除整个终端 顺便说一句 我使用 VSCode tl dr 问题是关于清零的both屏幕和回滚缓冲区 in the 综合终端 of 视觉工作室

随机推荐