- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我编写并维护了一个程序 rlwrap它使用伪终端与子进程通信。 Pseudo-terminals (ptys) 存在于所有 Unix(类)系统中,但它们在不同平台上的行为略有不同。
恰当的例子:在 rlwrap
中,父进程使从 pty 保持打开状态以密切关注子进程的终端设置(在 Linux 和 FreeBSD 上可以使用主进程,但在 Solaris 中不行, 例如)
在 FreeBSD (8.2)(但不是 Linux)上,这会导致子进程的最终输出丢失。例如:
#include <stdio.h>
/* save as test.c and compile with gcc -o test test.c -lutil */
#define BUFSIZE 255
int main(void) {
int master, slave;
char buf[BUFSIZE];
int nread;
openpty(&master, &slave, NULL, NULL, NULL);
if (fork()) { /* parent: */
close(slave); /* leave this out and lose slave's final words ... WHY? */
do {
nread = read(master, buf, BUFSIZE);
write(STDOUT_FILENO, buf, nread); /* echo child's output to stdout */
} while (nread > 0);
} else { /* child: */
login_tty(slave); /* this makes child a session leader and slave a controlling */
/* terminal for it, then dup()s std{in,out,err} to slave */
printf("Feeling OK :-)\n");
sleep(1);
printf("Feeling unwell ... Arghhh!\n"); /* this line may get lost */
}
return 0;
}
父进程将按预期回显子进程的输出,但是当我省略 close(slave)
时(保持打开状态,就像在 rlwrap
中一样):
是否在某处记录了此行为?有理由吗?在父进程中不关闭slave可以绕过吗?
我发现不让从设备成为控制终端——用一些简单的dup()
调用替换login_tty
调用——将解决问题。然而,这不是 rlwrap
的解决方案:相当多的命令需要一个控制终端 (/dev/tty
) 进行通信,因此 rlwrap
有为他们提供一个。
最佳答案
我认为 Pty 有独特的独立行为。
代码依赖于存在足够长的管道来发送数据,但是退出的子进程可能导致虚拟 channel 在接收到数据之前被删除。
这对于 Pty 来说是独一无二的,对于真正的终端来说是不存在的。
关于c - 如果未在父级中关闭,则从属 pty 上的最终输出将丢失。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23458160/
我正在尝试使用库 node-pty在一个使用 vue-cli 搭建的项目中。当我启动程序时,我收到以下错误: error in ./node_modules/node-pty/build/Releas
我打开了一个 issue in creack/pty for this question ,但实际上我认为它可能属于这里,因为它可能更多地与我对库的使用有关,而不是库有任何问题。 我正在使用 webs
我一直在阅读本页示例中的 ptys:http://www.rkoucha.fr/tech_corner/pty_pdip.html .我有两个问题: 使用 pty 和使用管道之间的区别或最重要的区别是
我正在尝试向 ruby-newt 模块添加一些自动化测试。我的代码似乎可以工作,但仍然需要在终端手动点击 ENTER 才能完成。 例如在下面的代码中,\t会切换到下一个按钮,\r会按下按钮,两个命令都
我试图在代表 PTY 的文件描述符上设置读取超时。我在 termios 中设置了 VMIN = 0 和 VTIME = 10,我希望在字符可用时返回,或者如果没有字符可用则在一秒钟后返回。但是,我的程
我正在编写一个程序来创建 pty,然后 fork 并执行 ssh以 pty 的从属端作为其 stdin 的命令。完整的源代码在这里。 using namespace std; #include #i
我在尝试使用 Node 安装 pty.js 时遇到了一个不寻常的问题: 如果我运行 npm install pty.js 我收到这个错误: > pty.js@0.3.1 install /Use
我一直在用 c++ 编写一个程序,它可以 fork 一个 pty。一切顺利,除了一件事:当 root 运行程序时,pty 以 root 用户身份登录。同样,如果用户“x”运行该程序,则新的 pty 将
我有一个脚本,如果它在 tty 上,它会打印彩色输出。他们中的一堆并行执行,所以我不能把他们的标准输出到 tty。我也无法控制脚本代码(强制着色),所以我想通过 pty 伪造它。我的代码: invoc
我有一个特殊情况,我想伪造一个 tty 到在 ThreadPoolExecutor 中运行的子进程(想想 xargs -p)并捕获输出. 我创建了以下似乎串行运行良好的: import context
我正在编写测试脚本,需要在后台每隔一段时间收集“free -m”输出。但是,watch cmd 发送控制序列以删除旧输出,认为它在终端中。但我不想要那样,我想要贯穿整个过程的值(value)。这可能吗
我正在打开一个 PTY(在 Python/Linux 中)并写入它。我可以通过 minicom 完美地读取它。但是,我无法在另一个 Python(或 C++)程序中读取它。这是一个最小化的示例: pr
我编写了一个嵌入式应用程序(vt52 终端仿真器),在基于 Linux ROM 的系统上运行,没有内置 ptys;和Unix98坏了。但由于我必须有 pty 才能使终端工作...我手动将旧式 BSD
我正在尝试使用 Node 进程来启动交互式 docker session ,然后自动执行一些命令: var spawn = require('pty.js').spawn; var proc = sp
我正在尝试制作一个小模块,它打开 ssh 连接并允许通过 ssh 发送命令并返回命令的输出。因此,应该只有一个 ssh 连接(这样多个命令就不会导致自动阻止)。我知道 paramiko,但我无法使用它
我是这样创建的 pty 设备的所有者权限是crw-w---- mknod pty1 c 1 1 cat > pty1 告诉我不允许操作。 我稍后要做的是使用 open 从程序打开文件并调用 write
这个问题在这里已经有了答案: How to make output of any shell command unbuffered? (5 个答案) 关闭 9 年前。 我正在寻找一种方法来欺骗 Li
当使用 PTY 主/从对控制进程时,我想向相关进程指示 stdin 已关闭并且我没有更多内容要发送,但我仍想接收进程的输出。 要注意的是,我只有一个文件描述符(PTY“master”),它处理来自子进
我正在使用 pty 读取非阻塞进程的标准输出,如下所示: import os import pty import subprocess master, slave = pty.openpty() p
我编写了一个简单的包装器脚本,用于在命令失败时重复命令,称为 retry.py .但是,因为我想查看子命令的输出,所以我不得不使用一些 pty 技巧。这适用于 rsync 等程序,但 scp 等其他程
我是一名优秀的程序员,十分优秀!