strace追踪system("clear")及汇编终端清屏相关技术问题咨询
终端清屏功能实现相关疑问
我在开发终端清屏功能时,检索到两类参考实现思路:
- 思路1:不通过填充空白字符的方式实现清屏
- 思路2:Linux环境下使用NASM汇编实现终端清屏
目前我已经完成第二类思路的编码,功能运行正常,现有以下三个问题待确认:
1. 汇编代码中. - clear的语法规则
我在GNU as官方使用文档中没有查询到该语法的相关说明,对应的汇编代码如下:
.section .data clear: .string "\033[H\033[2J" .equ CLEAR_LEN, . - clear .section .text .globl _start _start: movq $1, %rax movq $1, %rdi movq $clear, %rsi movq $CLEAR_LEN, %rdx syscall movq $60, %rax syscall
2. 第一类清屏方案的可用性判断
我实际使用Xshell连接远程Linux主机,并非MSDOS环境,终端窗口大小支持动态调整,手动填充空白的清屏方案需要先获取终端尺寸,实现难度较高,我判断该方案不具备实际可用性,想确认这个判断是否准确。
3. system("clear")调用的strace追踪结果校验
我已知C语言中可以调用system("clear")实现清屏,推测该实现逻辑同样可以移植到汇编中,因此使用strace追踪对应C代码的运行过程,被追踪的C代码如下:
#include <stdlib.h> int main(void) { system("clear"); return 0; }
追踪结果中出现了若干特殊的系统调用记录,我想确认这些系统调用是否为终端清屏功能对应的调用,追踪到的系统调用记录如下:
rt_sigaction(SIGINT, {sa_handler=SIG_IGN, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7fadf89dc0c0}, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0 rt_sigaction(SIGQUIT, {sa_handler=SIG_IGN, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7fadf89dc0c0}, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0 rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0 ... rt_sigprocmask(SIG_BLOCK, ~[], [CHLD], 8) = 0 ... rt_sigaction(SIGINT, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7fadf89dc0c0}, NULL, 8) = 0 rt_sigaction(SIGQUIT, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7fadf89dc0c0}, NULL, 8) = 0 rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0 --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=640502, si_uid=1000, si_status=0, si_utime=0, si_stime=0} ---
内容的提问来源于stack exchange,提问作者OnlyWick
相关产品推荐
相关产品推荐

