Tmux 是一个终端复用器,允许用户在一个终端会话中管理多个终端会话。用户可以在一个窗口中分割多个面板、创建多个窗口、以及在不同会话之间切换。更重要的是,它可以在会话分离后继续运行任务,并在会话重新连接时恢复原来的状态(正如我们在开篇中的视频里展现的那样)。这使得它非常适合需要同时处理多个任务和长时间运行任务的用户。
rt-smart 已经支持基于 Dropbear 的SSH 服务器,从而可以使用主机电脑用SSH远程登录来使用板端Smart操作系统。
https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-smart/introduction/rt-smart-experiences/rt-smart-experiences?id=%e6%8a%a2%e5%85%88%e9%a2%84%e8%a7%88
smart上手体验 (rt-thread.org)
从以上链接可以获取 smart-prebuild预构建镜像。使用 prebuilt 版本启动系统后,可以在 /etc/inittab中看到如下内容:
其中含有dropbear的启动命令/bin/dropbear -F 2>/root/dropbear.log,故系统启动时自动启动dropbear ssh服务器。qemu启动脚本则将qemu的22号端口映射到主机58080端口。
第一个启动的 Tmux 窗口,编号是0,第二个窗口的编号是1,以此类推。这些窗口对应的会话,就是 0 号会话、1 号会话。当然,使用编号区分会话不太直观。因此我们也可以为会话起名,便于记忆。
tmux new-s <session-name>
使用上面的命令就可以创建一个指定名称的会话。下图展示了这个命令的使用。在创建会话后,我们可以如同普通 shell 那样在tmux 中执行命令。
此外,在执行脚本的过程中,按下Ctrl+b d或者输入tmux detach -t
tmux attach -t <num>/<name>
我们使用上面的命令接入先前创建的会话。这时终端回到原有的会话现场。这给我们检查之前创建的管道状态提供了巨大便利。
下图展示了会话创建后脱离并重新连接的过程:
我们先使用tmux new-s hello 命令创建了一个名为hello的会话,接着使用Ctrl+b d 组合键将当前会话与窗口分离,接着又使用tmux attach -t hello接入hello会话现场。这时我们可以看到脚本仍在正常执行。
tmux switch -t /
此外,当我们创建了多个会话时,可以通过tmux switch 来切换不同的会话。这里以hello 为例子。
上图中可以看到成功切换到hello,里面的进程仍在运行
tmux rename-session -t /
此外,我们还可以通过命令重命名已经创建的会话。
对于不想要的会话也可以通过tmux kill-session -t
Tmux 可以将窗口分成多个窗格(pane),每个窗格运行不同的命令。以下命令都是在 Tmux 窗口中执行。
● 使用tmux split-window可以划分上下两个窗格,tmux split-window -h可以划分为左右两个窗格。
● 窗格划分后,可以通过tmux select-pane -U/D/L/R 命令移动光标位置,或者使用快捷键 ctrl+b
下面是窗格管理的快捷键使用大全:
Ctrl+b %:划分左右两个窗格。
Ctrl+b ":划分上下两个窗格。
Ctrl+b :光标切换到其他窗格。是指向要切换到的窗格的方向键,比如切换到下方窗格,就按方向键↓。
Ctrl+b ;:光标切换到上一个窗格。
Ctrl+b o:光标切换到下一个窗格。
Ctrl+b {:当前窗格与上一个窗格交换位置。
Ctrl+b }:当前窗格与下一个窗格交换位置。
Ctrl+b Ctrl+o:所有窗格向前移动一个位置,第一个窗格变成最后一个窗格。
Ctrl+b Alt+o:所有窗格向后移动一个位置,最后一个窗格变成第一个窗格。
Ctrl+b x:关闭当前窗格。
Ctrl+b !:将当前窗格拆分为一个独立窗口。
Ctrl+b z:当前窗格全屏显示,再使用一次会变回原来大小。
Ctrl+b Ctrl+:按箭头方向调整窗格大小。
Ctrl+b q:显示窗格编号。`在这里插入代码片`
下面展示使用快捷键分割窗口和切换光标位置的过程:
除了将一个窗口划分成多个窗格,Tmux 也允许新建多个窗口。我们可以使用 tmuxnew-window命令创建新窗口,通过tmux select-window -t
这些命令同样有快捷键替代:
Ctrl+b c:创建一个新窗口,状态栏会显示多个窗口的信息。
Ctrl+b p:切换到上一个窗口(按照状态栏上的顺序)。
Ctrl+b n:切换到下一个窗口。
Ctrl+b :切换到指定编号的窗口,其中的是状态栏上的窗口编号。
Ctrl+b w:从列表中选择窗口。
Ctrl+b ,:窗口重命名。
使用快捷键进行窗口的创建,切换,重命名过程如下:
同样如果想要关闭某个窗格可以使用Ctrl+b x组合命令,这里不再演示
RTT内核用作ssh服务器,我们就可以通过scp来向其传输文件。以通过终端工具传输 mksd 脚本为例。我们首先配置好 RT-Smart 服务器的地址和用户名,密码。然后可以直接拖动客户端操作系统上的文件到左侧文件系统视窗中。此时会自动建立 scp 进程完成文件拷贝。
Tmux 的这些强大功能依赖于操作系统的几个核心机制。首先是会话和进程组,Tmux 利用这些机制来管理和组织不同的终端会话和进程。每个 Tmux 会话可以包含多个窗口,而每个窗口又可以包含多个进程,这些进程被组织成进程组,以便统一管理。
其次,终端和伪终端是 tmux 实现多窗口和分割面板的基础。伪终端提供了一个虚拟终端设备,使得用户可以创建和管理多个虚拟终端,这些终端可以独立运行并显示各自的输出。
此外,Tmux 是一个基于前后端架构的应用。前端负责用户输入和显示输出,而后端负责实际的任务管理和执行。前后端通信及异步事件处理也依赖于 libevent 库。libevent 是一个轻量级的事件驱动编程库,它基于 Unix 域套接字(UDS)、netlink 等基础设施,为进程间双工通信、多播和内核异步事件通知提供了高效的实现。这使得 tmux 能够在需要处理大量并发事件时,依然保持高效、稳定的运行。
信号处理也是 tmux 功能的关键部分。Tmux 可以在会话分离和重新连接时通过内核提供的 SIGCONT、SIGSTOP 等POSIX 作业控制信号正确地管理和恢复进程状态,确保任务能够持续运行而不受干扰
上图总结了 Tmux 在 RT-Thread Smart 的运行环境中的各类软硬件组件。它们保证了 RT-Thread Smart在多个方面为程序应用提供了便利和灵活。无论是进程间通信、与内核进行信息交换、还是通过netlink 处理异步事件,抑或是通过伪终端与终端仿真器进行交互,用户程序都能够更加轻松地操作系统,提高工作效率。RT-Smart 系统提供的丰富系统组件为嵌入式开发带来了更多可能性,让我们在这个快速发展的技术世界中走得更快、更远。
本文我们介绍了 RT-Thread Smart 系统在支持复杂应用方面的强大能力。从多窗口终端管理的 tmux 到远程登录的 SSH,RT-Thread Smart 展现了其在嵌入式开发中的灵活性和高效性。
希望通过本文,能够让更多的开发者了解并使用 RT-Thread Smart,在这个充满活力的平台上实现更多精彩的应用。让我们一起期待,在未来的嵌入式开发旅程中,RT-Thread Smart 将继续为我们带来更多惊喜和便利。
欢迎大家在 RT-Thread Github 仓库或论坛上向我们反馈意见和建议。另外,如果您对参与到 RT-Thread 的平台支持(risc-v、arm、arm64 平台上的驱动、内核代码完善)、应用移植与开发、文档维护感兴趣,我们诚邀您加入 Smart 兴趣小组,参与到与 Smart 相关的开源贡献中。
最后是次回预告。我们计划在下一篇文章为大家分享 RT-Thread Smart 在多核平台上的实时性能表现。如果您感兴趣还请持续关注。
——————End——————