C语言 如何使用"system()"模拟ctrl序列?



如果我在终端(LINUX(中使用CTRL + A CTRL + K,它会清除我在终端中键入的行。我想通过代码中的system()调用来执行此功能。我应该将哪些参数传递给system()才能使其运行 CTRL + A CTRL + K?

如果您只想清除当前行作为应用程序输出并将光标移动到开头,则不需要使用system();而只需使用printf。代码r表示回车,并将光标移动到行首,ANSI 转义序列CSI 2 K将清除整行 - CSI 由 2 个字符组成:ASCII ESC (33( 和[

因此:

#include <stdio.h>
#include <unistd.h>
int main(void) {
printf("Here be demo");
fflush(stdout);
sleep(1);
printf("r33[2KIt works!n");
}

你很可能试图做错什么。

首先,请注意,您可以仅用^U清除该行。 ^K从当前位置删除内容,^A将您带到开头,这是一种迂回的方式。

大多数程序不应该接受交互式输入,而是从命令行获取参数(argc和argv的东西(。在极少数情况下,程序必须是交互式的,您通常不希望进行任何显式的屏幕操作。在更不可能的情况下,进行上述管理是有意义的,你想使用类似 ncurses 的东西。

也就是说,我强烈建议您详细说明您的实际问题。

这毫无意义,但您可以在system()中使用 Ctrl+A Ctrl+K,方法是制作一个分配 PTY 的命令,运行像bash这样的 readline 命令,然后将 ASCII 0x01 0x0B写入它。scriptprintf允许您执行以下操作:

void main() {
system(
"{ sleep 1; "
"echo -n 'part of a line. deleting with Ctrl+A Ctrl+K soon...'; "
"sleep 3; "
"printf 'x01x0b'; "
"sleep 2; "
"} | script -q 'bash'"
);
}

这将显示一个bash提示符,模拟写入"一行的一部分..",然后它将Ctrl-A Ctrl-K写入它,删除它。

确保逐字尝试它而不进行任何更改,因为它无法适应在更大的程序中执行任何有用的操作。

PS:如果要编写和覆盖线条以创建微调器或进度条,则应问的问题是"如何编写和覆盖线条以创建微调器或进度条?

首先检查这些命令给出的终端控制序列。您可以通过在命令前按 CTRL + V 来执行此操作。您可能会得到

^A^K

如果要通过system()调用执行此操作,则应使用它调用命令,该命令将此终端控制序列弹出到屏幕上。最简单的命令是/bin/echo.一个

/bin/echo -ne '^A^K'

也会这样做。把它交给system()

system("/bin/echo -ne '^A^K'");

和奇迹。

最新更新