是否行
deb http://deb.debian.org/debian/ buster main
sources.list
对应 Debian 10.0 还是 10.1 ?
是否行
deb http://deb.debian.org/debian/ buster main
sources.list
对应 Debian 10.0 还是 10.1 ?
打开xterm
,运行tty
并查看伪终端从文件(假设它是/dev/pts/0
)。然后打开另一个xterm
并运行
$ stty -F /dev/pts/0
speed 38400 baud; line = 0;
lnext = <undef>; discard = <undef>; min = 1; time = 0;
-brkint -icrnl -imaxbel iutf8
-icanon -echo
然后/bin/sleep 1000
在第一个 xterm 中运行。然后再次在第二个 xterm 中运行相同的stty
命令:
$ stty -F /dev/pts/0
speed 38400 baud; line = 0;
-brkint -imaxbel iutf8
sleep
然后在第一个 xterm 中终止命令。然后再次在第二个 xterm 中运行相同的stty
命令:
$ stty -F /dev/pts/0
speed 38400 baud; line = 0;
lnext = <undef>; discard = <undef>; min = 1; time = 0;
-brkint -icrnl -imaxbel iutf8
-icanon -echo
我们看到 bash 在运行命令之前更改 tty 属性,并在运行命令后恢复它们。它在 bash 文档中的描述在哪里?tty 属性是否全部恢复,或者某些属性被程序更改后可能无法恢复?
具体来说,让我们用伪终端术语来说话。假设我们有文件描述符master
和slave
一个伪终端对(假设它是一个控制 tty)。禁用IXON
on master
(或slave
,效果相同)意味着当我们这样做时write(master, &control_s_code, 1)
,read(slave, &byte, 1)
将获得此代码。同样的担忧control_q_code
。问题是:禁用有什么作用IXOFF
?
当 pty 的从属端未打开时,strace
在执行此操作的进程上read(master_fd, &byte, 1);
显示:
read(3,
因此,当没有人连接到 pty 的从属端时,read()
等待数据 - 它不会返回错误。
但是当一个进程打开 pty 的从属端并且该进程退出时,进程会因此read()
而死:
read(3, 0xbf8ba7f3, 1) = -1 EIO (Input/output error)
pty 是用
master_fd = posix_openpt(O_RDWR|O_NOCTTY)
pty 的从属端打开
comfd = open(COM_PORT, O_RDWR|O_NOCTTY)
为什么在read()
打开 pty 从属端的进程退出时退出?这是在哪里描述的?
bash
与 STDIN、STDOUT 和 STDERR 一起使用。打开时xterm
,它会分配伪 tty。然后 xterm fork 子进程和 STDIN、STDOUT、STDERR 被绑定到slave_fd
viadup2
并被exec
调用bash
。这很好。
但是如何bash
直接与 TTY 合作呢?如何使bash
执行open("/dev/ttyS0", O_RDWR)
?这样我就可以将设备连接到设备/dev/ttyS0
并从设备执行命令bash
。
我试图理解ssh
的-t
选项:
-t
强制伪终端分配。这可用于在远程机器上执行任意基于屏幕的程序,这非常有用,例如在实现菜单服务时。多个 -t 选项强制分配 tty,即使 ssh 没有本地 tty。
所以,TTY 是一个设备。引用 TTY 的一种方法是通过描述符(通过打开 TTY 设备获得)。STDIN、STDOUT 和 STDERR 是描述符。但它们不一定指 TTY 设备。-t
选项强制他们引用 TTY 设备。为了理解这个选项的作用,这是正确的推理方式吗?
而 TTY 有什么特别之处,用普通的 STDIN、STDOUT 和 STDERR 可能无法实现?
-t
欢迎提供选项用例的示例。
通过哪种机制ssh
分配该 TTY?ssh
是在服务器上还是在客户端上创建新的 TTY ?如何检查这个?(/dev/
必须出现一个新节点或其他东西......)这个新的 TTY 如何与现有的 STDIN、STDOUT 和 STDERR 相关联?
假设我们需要运行应用程序并在退出screen
时保持运行。screen
以下命令完成这项工作,但前提sleep 1
是附加了“”。为什么没有“”它不起作用sleep 1
?
screen -d -m -L sh -c 'DISPLAY=:0 nohup zenity --info --text test >/dev/null 2>/dev/null &'