pty是一个伪终端 - 它是一个软件实现,它作为终端出现在附加程序中,但不是直接与“真实”终端通信,而是将输入和输出传输到另一个程序。
考虑以下 C 程序,名为 odd.c (因为它所做的事情没有意义): #包括 #包括 #包括 #包括 考虑下面的 C 程序,名为 weird.c(因为它所做的事情没有意义): #include <inttypes.h> #include <stdint.h> #include <stdio.h> #include <unistd.h> int main(void) { off_t result = lseek(STDOUT_FILENO, (off_t)INT64_MAX, SEEK_SET); if (result != (off_t)-1) printf("Seek successful to position %" PRId64 "\n", (int64_t)INT64_MAX); else perror("lseek failed"); return 0; } 从终端窗口编译并运行它,例如gcc -o weird weird.c && ./weird。从 tty(终端窗口、SSH 会话等)运行它非常重要,因此 stdout 是一个 tty。 在 Linux 上,它将失败并出现错误 lseek failed: Illegal seek – 这是有道理的,在 tty 上查找没有多大意义。 但是,在 macOS 上,它的行为有所不同 - 程序退出而不打印任何内容,然后 shell 也退出。我只能假设这是因为 tty 已进入某种非法状态。但这里到底发生了什么? 顺便说一句,我猜测 macOS 的行为与 FreeBSD 类似。但是 FreeBSD 14.1-RELEASE (amd64) 再次有不同的行为 – 它打印: Seek successful to position 9223372036854775807 这比 macOS 的做法更容易理解(例如,将无意义的操作视为无操作,而不是像 Linux 那样出错。) 黑客新闻上的用户jepler指出了解释。 注意vn_write函数中的这段代码bsd/vfs/vfs_vnops.c: if (write_offset == INT64_MAX) { /* writes are not possible */ error = EFBIG; goto error_out; } 基本上发生的事情是这样的: 在 macOS 中,与 Linux 不同,您可以使用 lseek 设置终端的偏移量 - 即使偏移量实际上没有执行任何操作 但是,一旦偏移量达到 INT64_MAX,进一步的写入尝试就会失败并出现 EFBIG,除非您返回到更早的某个位置。 shell 退出的原因是大多数 shell 在无法写入 stdout/stderr 时退出。 如果您修改我的测试程序以寻求例如INT64_MAX-100,在所有输出开始失败之前,您将能够打印 100 个字节的输出。 此代码似乎已在 xnu-7195.50.7.100.1 (macOS 11 Big Sur) 中引入 - 它在 xnu-6153.11.26 (macOS 10.15 Catalina) 中不存在。 FreeBSD 似乎还允许您在终端中 lseek 到任意偏移量 - 但与 macOS 11+ 不同,如果您查找到 INT64_MAX,则不会拒绝进一步写入。
我正在阅读《TTY 揭秘》,试图对 tty、pty 有一些了解。 读完前半部分。当我输入一些内容时,我无法全面了解整个事情是如何工作的
我有一个 shell,我在其中使用 su -l anotheruser 切换到另一个用户,这主要有效 但是,当没有分配给 su 的 pty 时,会出错: su:必须从终端运行 所以,我尝试...
出于教育目的,我有一些场景需要处理。 主要是使用 socat 模拟嘈杂的串行线(我目前有版本 1.7.4) 我将详细说明: 我的软件有...
背景:我正在尝试仅使用“Git for windows”附带的工具创建一个伪终端,所以如果 XYZ 需要额外的 na,请不要告诉我“只需安装工具 XYZ”...
我们有一个站点,它使用 node-pty 从本地 Node.js 代理公开远程 shell 终端。我们还有一个基于 Python 的代理,并希望提供经验。 Node.js 代码看起来...
我目前正在构建一个将 Docker 容器连接到 websocket 的系统,然后客户端可以通过 websocket 与该容器交互。我想给客户能力...
我正在尝试使用伪 tty 发送和接收数据,以便稍后使用链接到串行 RS232 USB 适配器的真实 tty。 我首先使用 socat 创建伪 tty: sudo socat -d -d pty,link=./
我无法使用nodeJS和websocket将docker容器与我的Web终端连接
以下是我目前正在处理的文件: const express = require('express'); const http = require('http'); const { 服务器 } = require("socket.io"); const Docker = require('dockerode'); ...
我遇到的是我写了一个简单的python脚本,名为tt.py: 导入时间 而真实: 打印(123) 睡眠时间(0.5) 我通过 python tt.py & 运行它,它将持续输出到终端 123...
PTY/TTY - 仅使用 Slave FD 有什么不能做的
问题: 如果我有一个 pty 或 tty 主/从对,如果我只有从节点的文件描述符,我不能用它做什么?或者,换句话说:只有拥有主节点的文件我才能做什么
运行 bash 的子进程在执行终端窗口上打印 ssh 登录提示符,而不是通过管道输入的代码,我不知道为什么
我正在用 C 语言为老式串行终端编写一个兼容层。它不支持正常的 ANSI 转义序列等,所以我使用一个程序作为 bash 和 te 之间的中间人...
python 2.7 - 与 mpg123 的子进程控制交互
几周前我在这里问了一个与此相关的问题: Python、mpg123 和子进程未正确使用 stdin.write 或通信 感谢那里的帮助,我能够做我需要的事情......
安装 VSCode 后,我开始收到此特定通知: 与终端 pty 主机进程的连接无响应,终端可能停止工作。 该通知...
我正在用 Rust 创建一个终端模拟器,目前正在尝试伪终端 (PTY) 并尝试捕获在 PTY 中执行的 shell 命令的输出。然而,...
尝试在终端仿真器中读取命令输出时,Rust PTY 输出挂起
我正在用 Rust 创建一个终端模拟器,目前正在尝试伪终端 (PTY) 并尝试捕获在 PTY 中执行的 shell 命令的输出。然而,...
VScode与WSL连接“与终端pty主机进程的连接无响应,终端可能停止工作。”
我在 Windows 10 上安装了 wsl 2,并且我已将 VScode 与 wsl 连接。很多时候,当我在 VScode 中使用 wsl 环境运行 gatsby 应用程序时。我收到错误: 与终端 pty 的连接
我有一个由第三方开发的与终端通信的Linux进程。为了调试,我希望看到通信来回。 人们可能会认为猫会做到这一点(...
我想运行此示例 https://github.com/Gottox/node-webterm ,但是当我执行命令 npm install 时,它显示错误消息。 在此解决方案中一次构建一个项目。启用
无法 ssh 进入 git:通道 0 上的 PTY 分配请求失败
我正在尝试更新自制程序,但无法连接到 git.. 我看到 https 没有通过,当我尝试 ssh -t 时,我得到: PTY 分配请求在通道 0 上失败 这些是我的结果表...