
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——————

