如何使用`system()`模拟ctrl序列?

时间:2017-07-19 01:17:11

标签: c linux parameters command-line-interface terminal-emulator

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

4 个答案:

答案 0 :(得分:2)

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

因此:

[

答案 1 :(得分:0)

你很可能试图做错事。

首先是一个小注释,你可以用^ U来清理这条线。 ^ K从当前位置移除东西,^ A将您带到开头,这是一种圆形的方式。

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

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

答案 2 :(得分:0)

这没有任何意义,但你可以在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 '\x01\x0b'; "
      "sleep 2; "
      "} | script -q 'bash'"
      );
}

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

请务必逐字尝试,不做任何更改,因为它无法适应在较大程序中执行任何有用的操作。

PS:如果你想编写并覆盖一行来创建微调器或进度条,你应该问的问题是"如何编写和覆盖一行来创建微调器或进度条?&# 34;

答案 3 :(得分:-3)

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

^A^K

如果您想通过system()调用执行此操作,则必须使用它调用命令,该命令会将此终端控制序列弹出到您的屏幕。最简单的命令就是/bin/echo。甲

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

也会这样做。将其提交给system()

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

并且好奇。